繁体   English   中英

如何在Java中使用@ManyToMany关系自动加载实体

[英]How to automatically load Entities with @ManyToMany relations in Java

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

这是我的用户实体:

@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)); 并且它可以正常工作,我可以访问用户的电子邮件,bday,用户名等。但是,当我尝试获取用户卡时,会收到以下消息{IndirectList: not instantiated} 在有人问之前,我确实尝试过初始化User构造函数上的列表,并出现相同的消息。

我期望的是,用户已从DB加载,并且其所有卡都已加载在card属性中。

集合值关系的默认访存类型是lazy。 提交事务后,所有已加载的实体都将变为分离状态,并且您将无法访问惰性加载实体。

我认为您在另一笔交易中检索了该用户。

请检查您的TransactionAttribute批注。

一些可能的解决方案是:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM