【问题标题】:How do Hibernate/JPA persist objects in side another object?Hibernate/JPA 如何将对象持久保存在另一个对象中?
【发布时间】:2012-01-12 16:43:18
【问题描述】:

我有三个持久的类(House、Room、Address)(使用 JPA/Hibernate 映射)

@Entity
@Table(name = "HOUSE")    
@AttributeOverrides({@AttributeOverride(name = "house_id", column = @Column(name =     "house_id"))})
  public class House{


     @Basic     
     private String key;
     @OneToMany(mappedBy = "house", cascade = {CascadeType.ALL},    orphanRemoval = true)
     private List<Room> rooms;

        @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST})
        @JoinColumn(name = "add_id")
        private Address address;
}

 public static void main(String args){
 String key="key1";
 Room room1=...
 Room room2=...
 List<Room> rooms=//add the two rooms
 .
 .
 House house= new House(key, rooms, address);

 // Here is my question.
 // Now I call the save method on the persistent class

  house.save();
}

1) Address 和 Room 对象是否会自动持久化,还是必须在调用 house.save() 之前对它们中的每一个(room1.save()room2.save()address.save())调用 save 方法?当我删除房子obj时怎么样?

2) 类“house”是层次结构的顶部。我知道,如果我们在拥有实体上调用保存,它也会保留房间和地址。反过来呢?如果我编辑了房间,我如何确保“房子”知道它?

【问题讨论】:

标签: hibernate jpa orm persistence


【解决方案1】:

不是您设置的方式。您需要使用注释@Id 将每个实体中的一个成员标记为 id。然后你需要映射你的组合实体是如何相互关联的。这是通过不同的注解完成的,例如@OneToMany@ManyToOne

最后,如果您希望能够通过仅调用 hibernateSession.save 与关系中的拥有实体来持久化组合实体,则它拥有的所有实体都必须标记为级联保存,以便持久化向下级联所有权树。

【讨论】:

  • 感谢您的回复。我已经编辑了我的问题。 “最后,如果您希望能够通过对关系中的拥有实体调用 save 来持久化组合实体,则它拥有的所有实体都必须标记为级联保存,以便持久化在所有权树下级联。”有道理
  • +1。请注意,保存不是实体的方法。它是 Hibernate Session 对象的一个​​方法,它接受一个实体作为参数。标准 JPA 方法是 persist,其行为略有不同。
  • 我还有一件事要问。 “房子”类是层次结构的顶部。我知道,如果我们在拥有实体上调用保存,它也会保留房间和地址。反过来呢?如果我编辑了房间,我如何确保“房子”知道它?
  • @MatX 它主要照顾自己。假设您加载一个房间对象,更改它,然后将其持久化。如果您随后加载拥有该特定房间的房屋,您将在其房间集合中获得正确的房间。如果你先加载房子,然后从它的房间集合中选择要编辑的房间,更改它并保留它,那么你的集合中已经有了那个房间。这能回答你的问题吗?
【解决方案2】:

您正在使用注释来提供映射元数据,但没有告诉 Hibernate 任何有关映射集合的信息。就目前而言,Hibernate 不会保留地址或房间。

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多