JPA 2.0 Provider Hibernate

Roo*_*ooh 6 java hibernate jpa java-ee jpa-2.0

我有一个非常奇怪的问题我们正在使用基于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

}
Run Code Online (Sandbox Code Playgroud)

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

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

jpk*_*ing 1

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

例如:

Parent1.address => Address #1
Child1.address => Address #2
Child2.address => Address #2
Child3.address => Address #1
Run Code Online (Sandbox Code Playgroud)

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