繁体   English   中英

JPA 2.0 Provider Hibernate

[英]JPA 2.0 Provider Hibernate

我有一个非常奇怪的问题我们正在使用基于hibernate注释的jpa 2.0通过JPA DDL生成的数据库是真的而MySQL作为数据库;

我将提供一些参考课程,然后我的问题。

@MappedSuperclass
public abstract class Common implements serializable{
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 @Column(name = "id", updatable = false)
 private Long id;

 @ManyToOne
 @JoinColumn
 private Address address;
        //with all getter and setters
        //as well equal and hashCode

}

@Entity
public class Parent extends Common{
         private String name;
         @OneToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, mappedBy = "parent") 
         private List<Child> child;
         //setters and rest of class
}

@Entity
public class Child extends Common{
//some properties with getter/setters
}

@Entity
public class Address implements Serializable{

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 @Column(name = "id", updatable = false)
 private Long id;

       private String street;
      //rest of class with get/setter

}

在代码中,您可以看到父类和子类扩展了Common类,因此它们都具有地址属性和id,当更改父类中的地址引用时,会出现问题,它反映了列表中所有子对象的相同更改以及更改了子项中的地址引用类然后合并它将改变父母的地址参考

我无法弄清楚它是jpa还是hibernate的问题

如果您有共享的Address实例,那么当它在子域的“范围”中所做的更改会影响父项,因为您正在处理父对象中的相同Address实例。

例如:

Parent1.address => Address #1
Child1.address => Address #2
Child2.address => Address #2
Child3.address => Address #1

在这种情况下,如果更改Child3.address.street,则表示它也更改了Parent1.address.street。 请注意,使Parent1和Child3中的Address相同的是ID。 如果它们具有相同的ID,则它们是相同的实例(即:在两个对象中“共享”)。

暂无
暂无

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

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