【问题标题】:How to automatically load Entities with @ManyToMany relations in Java如何在 Java 中自动加载具有@ManyToMany 关系的实体
【发布时间】:2018-12-04 23:11:49
【问题描述】:

我正在尝试学习如何创建一个 Java Enterprise 应用程序(目前使用 EclipseLink),在那里我有一个 User 实体,它与 Card 实体有 @ManyToMany 关系,但是当用户得到从数据库加载,卡片属性不会像我期望的那样自动填充。

这是我的用户实体:

@Entity
@Table(name = "USR")
public class User extends Person implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "CPF", unique = true, nullable = false)
    private String cpf;

    @Column(name = "USERNAME", length = 20, nullable = false, unique = true)
    private String username;

    @Column(name = "BDAY")
    @Temporal(TemporalType.DATE)
    private Date bDay;

    @Column(name = "EMAIL", length = 100, nullable = false, unique = true)
    private String email;

    @ManyToMany
    private List<Card> cards;

    public User() {
        super();
    }
}

这是我的卡片实体:

@Entity
public class Card implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String number;

    @Column(name = "EXP_DATE")
    @Temporal(TemporalType.DATE)
    private Date expDate;

    @Column(name = "VALIDATOR")
    private int validator;

    @Transient
    private String endsWith;

    public Card() {
    }
}

所以当我的servlet 被实例化时,我像userBean.setUser(userFactoryEJB.find(2)); 这样从数据库中加载一个用户并且它工作正常,我能够访问用户的电子邮件、生日、用户名等。但是当我尝试获取用户卡我收到以下消息{IndirectList: not instantiated}。在有人可能会问之前,我确实尝试在 User 构造函数上初始化列表并出现相同的消息。

我所期望的是,用户从数据库中加载,他们的所有卡片都已加载到卡片属性中。

【问题讨论】:

  • 尝试访问它是什么意思?您发布的消息不是错误。您是在调用 getCards 并遍历列表吗?

标签: java jpa jakarta-ee eclipselink


【解决方案1】:

集合值关系的默认获取类型是惰性的。提交事务时,所有加载的实体都将分离,您无法访问延迟加载实体。

我认为您在另一个事务中检索用户。

请检查您的 TransactionAttribute 注释。

一些可能的解决方案是:

1) 您是在 CDI bean 中还是在另一个会话 bean 中使用 userFactoryEJB?您必须从另一个会话 bean 调用 userFactoryEJB 或在您的 CDI bean 上使用 @Transactional。

2) 将获取类型更改为渴望。

@ManyToMany(fetch = FetchType.EAGER)
    private List<Card> cards;

3)定义另一个find方法,在返回用户之前调用getcrads()方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2014-05-13
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多