JPA 2.0提供者Hibernate

6

我有一个非常奇怪的问题,我们正在使用基于Hibernate注释的JPA 2.0,并且将MySQL作为数据库生成通过JPA DDL;

我会提供一些参考类,然后是我的问题。

@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的问题。


1
这里缺少一些映射信息。您是试图映射继承关系还是只是想将具有相似结构的PARENT表和CHILD表分开?您能否包含类级别的注释(@Entity等),就像您已经有的那样。 - Gareth Davis
删除对Spring MVC的引用,因为它与问题无关并会混淆视听。 - skaffman
谢谢Davis,是的我忘记放这些注释了,实际上我有一个单独的表格用于父类和子类,其中包含从继承类共同继承的字段。我无法弄清楚的是为什么它会改变父类中child->address的引用。当我只更改父类地址的引用时。 - Rooh
我在三个持久化上下文中尝试了描述的事件序列,并且它按预期工作。你能展示一下Hibernate生成的SQL吗?Hibernate将地址ID设置为错误的表格非常不可能。 - JesperSM
这个问题听起来像是你的entitymanager管理的实体范围存在问题。你能展示一下你如何使用entitymanager来做这件事吗(请在帖子中附上代码,因为评论中的信息太多了)。 - Lars Tackmann
显示剩余4条评论
1个回答

1
如果您共享地址(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,则它们是同一个实例(即:在两个对象之间“共享”)。

Partenon不是共享对象,父对象有自己的地址,子对象也有自己的地址。因此这些对象是不同的,并非共享对象。只是因为代码管理需要,所以将它们放在一个共同的类中。即使我已经通过删除共同的类并将地址属性放置在父对象和子对象中的不同类中,仍然可能存在EntityManager的某些问题。 - Rooh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接