2010-12-30 24 views
6

Mam bardzo dziwny problem, używamy jpy 2.0 z adnotacjami hibernacji opartymi na Baza danych wygenerowana przez JPA DDL jest prawdziwa, a MySQL jako baza danych;Dostawca JPA 2.0 Hibernate

Będę udostępniać niektóre klasy referencyjne, a następnie moje porblem.

@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 

} 

jak w kodzie widać, że rodzice i zajęcia dziecko rozszerza Common klasę więc oba mają właściwości adresową i id, problem pojawia się, gdy Zmiana refference adres w klasie nadrzędnej odzwierciedlać samą zmianę wszystkich obiektów podrzędnych w liście a jeśli adres zmiana refference w klasie dziecko następnie połączyć to zmieni adres refference rodzica oraz

nie jestem w stanie dowiedzieć się, czy to jest problem JPA lub hibernacji

+1

Brakuje tu trochę informacji mapujących. Czy próbujesz odwzorować dziedziczenie, czy też właśnie oddzielne tabele PARENT i tabele CHILD o podobnej strukturze? Czy możesz dołączyć adnotacje na poziomie klasy (@Entity itp.) Tak, jak je masz. –

+0

Usunięto odniesienia do Spring MVC, ponieważ nie jest to istotne i dezorientuje problem. – skaffman

+0

dzięki Davisowi Tak, zapomniałem umieścić te adnotacje, właściwie mam oddzielną tabelę dla rodzica i dziecka z polami z dziedziczonej klasy wspólnej. rzeczą, której nie mogę zrozumieć, jest to, dlaczego zmienia ona odniesienie do adresu child-> w rodzicu. kiedy zmieniam tylko adres adresu dla rodzica – Rooh

Odpowiedz

1

Jeśli mają wspólne wystąpień adres , zmiany dokonane, gdy są w "zasięgu" dziecka, wpływają na rodzica, ponieważ Ty mają do czynienia z tą samą instancją adresu w obiekcie nadrzędnym.

Na przykład:

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

W tym przypadku, jeśli zmienisz Child3.address.street, oznacza to, że również zmienił Parent1.address.street. Zauważ, że to co czyni Adres w Rodzicach1 i Dziecko3 to taki sam jest ID. Jeśli mają ten sam identyfikator, są tą samą instancją (np. "Współdzielona" między oboma obiektami).

+0

Partenon nie jest podzielony obiekt rodzic ma swój własny adres i obiekt chlid ma swój własny adres. tak, że obiekty są różne, a nie obiekt współdzielony, po prostu umieść we wspólnej klasie kodu zarządzania, nawet gdy umieściłem adres w klasie różnicowej, usuwając wspólną klasę i umieszczając właściwość adresu w obiekcie nadrzędnym i podrzędnym. Może być problem z EntityManager – Rooh

Powiązane problemy