2010-12-30 23 views
6

私は非常に奇妙な問題を抱えています。私たちは、hibernateアノテーションを基にした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 

} 

のコードのように、あなたはすべての子がリスト内のオブジェクトに変更親クラスのアドレスrefferenceが、それは同じ変更を反映するときに両方のアドレスプロパティとIDを持っているが、問題が発生し、親と子のクラスは共通クラスを拡張していることがわかりますそして、子クラスの変更アドレスrefferenceが、その後に合流するならば、それはJPAの問題があり、私はそれが把握することはできませんよアドレス親のrefference同様

を変更したり、住所のインスタンスを共有している場合は

+1

ここには欠落しているマッピング情報が少しあります。あなたは継承をマップしようとしていますか、まったく同じ構造を持つPARENTテーブルとCHILDテーブルを分けていますか?クラスレベルの注釈(@Entityなど)を持っていればそれを含めることができますか? –

+0

Spring MVCへの参照が削除されました。関連性がなく、問題を混乱させます。 – skaffman

+0

ありがとうDavisはい私はこれらの注釈を配置することを忘れました、実際には、継承されたクラス共通のフィールドを持つ親と子のための別のテーブルを持っています。私が理解できないことは、親の子アドレスの参照を変更する理由です。親のアドレスの参照を変更するとき – Rooh

答えて

1

を休止します子の「スコープ」内にあるときに加えられた変更は親に影響します親オブジェクト内の同じAddressインスタンスを扱っています。例えば

:あなたはChild3.address.streetを変更した場合この場合

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

、それはまたParent1.address.streetを変更したことを意味します。 Parent1とChild3のAddressを同じにするのはIDです。同じIDを保持している場合、それらは同じインスタンスです(つまり、両方のオブジェクトの「共有」)。

+0

partenon共有オブジェクトではないparentは独自のアドレスを持ち、chlidオブジェクトは独自のアドレスを持ちます。オブジェクトが共有オブジェクトではなく、共通クラスに配置されているだけです。共通クラスを削除し、親と子にアドレスプロパティを配置することによって差異クラスのアドレスを配置したとしても、EntityManagerに問題があります。 – Rooh