JavaEE JPA将对象与数据库

时间:2016-03-10 15:18:18

标签: jpa eclipselink entitymanager jta

我有一个User类和一个Email类。 我使用@OneToMany annotatioin来描述一个用户可以拥有多个电子邮件并且一个用户可以分配一封电子邮件的关系。

现在的问题是:在创建用户和电子邮件并将电子邮件分配给用户时,我试图找到一种方法,即JPA初始化电子邮件集。通常这在我做em.find(User.class, "test");时工作正常 这仅在我创建用户时不起作用。 emails属性的大小始终为0或甚至为null。但是当我创建用户,然后重新部署我的应用程序然后执行em.find(User.class, "test")时,电子邮件属性设置正确,大小为1,我可以访问它。

@Entity
public class User implements Serializable {
    private String username;
    private String password;
    private Set<Email> emails;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
    public Set<Email> getEmails() {
        return emails;
    }

    public void setEmails(Set<Email> emails) {
        this.emails = emails;
    }

    @Id
    @Column(name = "Username")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "Password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

-

@Entity
public class Email implements Serializable {
    private int id;
    private String email;
    private User user;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @ManyToOne
    @JoinColumn(name = "user")
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Basic
    @Column(name = "Email")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

-

User user = new User();
user.setUsername("test");
user.setPassword("asdf");
em.persist(user);

Email e = new Email();
e.setEmail("test@test.com");
e.setUser(user);
em.persist(e);

return user;

执行这些语句后,用户属性emails为空(显然)。但奇怪的是,当我在另一个方法中em.find(User.class, "test");时,emails属性的大小为0,即使记录已正确插入数据库。 当我现在重新部署我的应用程序并再次致电em.find(User.class, "test");时,emails属性的大小为1。 我已经尝试拨打em.merge();em.refresh();但无效。 我正在使用glassfish 4.1.1。作为事务类型,我使用JTA和eclipselink进行JPA实现

2 个答案:

答案 0 :(得分:1)

您需要将电子邮件添加到User以及merge用户(如果您分两步执行),或者(您可能需要cascade = CascadeType.ALL)将其添加到User开头persist User User user = new User(); Set<Email> emails = new HashSet<Email>(); user.setEmails(emails); user.setUsername("test"); user.setPassword("asdf"); Email e = new Email(); e.setEmail("test@test.com"); e.setUser(user); emails.add(e); em.persist(user); return user; 如果您只是一步完成。

Private Sub Form_Resize()

Select Case SSTab.Tab
Case TAB0_INDEX
    With fraTab0
        .Left = 150
        .Top = 320
        .Height = SSTab.Height - 400
        .Width = SSTab.Width - 200
    End With

Case TAB1_INDEX

    With txtMaxPixelData
        .Height = SSTab.Height - 850
    End With
    With txtPixelData
        .Height = txtMaxPixelData.Height
    End With
End Select
End Sub

答案 1 :(得分:0)

您需要设置任何双向关系的双方,JPA不会为您执行此操作。如果不这样做,则在从数据库重新加载/刷新之前,未设置的一方将不会反映数据库中的内容。您可以使用em.refresh(用户)强制刷新,但通常最好避免数据库命中,只需将电子邮件添加到用户的电子邮件列表中。