2010-12-30 5 views
6

У меня очень странная проблема, мы используем jpa 2.0 с аннотациями спящего режима на основе База данных, созданная через JPA DDL, является истинной и MySQL как База данных;JPA 2.0 Provider Hibernate

Я расскажу о некоторых ссылочных классах, а затем о своей значке.

@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 

} 

как в коде вы можете увидеть, что родители и дочерние классы расширяют общий класс так как имеет адрес собственность и идентификатор, проблема возникает, когда изменение адрес референс в родительском классе он отражает то же изменения во всех дочерних объектах в списке и если изменение адреса референс в дочернем классе, то на слияние будет изменить адрес референс родителя, а

я не могу понять, это является проблемой JPA или спящий режим

+1

Здесь немного информации о карте отсутствует. Вы пытаетесь отобразить наследование или используете ли вы какую-то отдельную таблицу PARENT и CHILD с аналогичной структурой? Можете ли вы включить аннотации уровня класса (@Entity и т. Д.), Как они есть у вас. –

+0

Убраны ссылки на Spring MVC, так как это не имеет значения и смущает проблему. – skaffman

+0

спасибо Дэвис да, я забыл разместить эти аннотации, на самом деле у меня есть отдельная таблица для родительского и дочернего с полями из унаследованного класса. я не могу понять, почему он меняет ссылку child-> address в родительском. когда я просто изменяю ссылку адреса для родителя – Rooh

ответ

1

Если у вас есть общие экземпляры адреса , изменения, внесенные, когда они находятся в «области» дочернего элемента, влияют на родителя, поскольку вы имеют дело с тем же экземпляром адреса в родительском объекте.

Например:

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

В этом случае, если вы измените Child3.address.street, то это означает, что он также изменил Parent1.address.street. Обратите внимание, что то, что делает Address в Parent1 и Child3 одинаковым, является идентификатором. Если они содержат один и тот же идентификатор, они представляют собой один и тот же экземпляр (т.е.: «совместно» между обоими объектами).

+0

partenon его не общий объект parent имеет свой собственный адрес, а chlid-объект имеет свой собственный адрес. так что объекты разные, а не общий объект, просто поместите в общий класс beacuse управления кодом, даже я поместил адрес в класс различий, удалив общий класс и разместив свойство адреса в родительском и child.may, если возникнет проблема с EntityManager – Rooh

Смежные вопросы