2016-12-05 6 views
0

私はプロジェクトで奇妙な必要があります。 2つのn:m +属性テーブルを結合します(私はダミー属性で動作を提示します)。ネストされたn:m +属性JPA

  1. FirstTable(idPlace、idAddress、idSchool、wage)joined 1:m;
  2. SecondTable(idPlace、idAddress、idSchool、数量、idEnterprise)

EDIT(例えば、スキーマ):もちろん enter image description here

私はテーブルの場所を持っている、住所、学校、彼らのそれぞれの持つエンタープライズエンティティクラスに実装されたID、取得、セット、および属性。

CODE:

場所

@Entity 
@Table(name = "Place") 
public class Place implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "idLine") 
private Long idLine; 

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.place") 
private List<FirstTable> firstTables; 
} 

住所

@Entity 
@Table(name = "Address") 
public class Address implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "idAddress") 
private Long idAddress; 

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.address") 
private List<FirstTable> firstTables; 
} 

学校

@Entity 
@Table(name = "School") 
public class School implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "idSchool") 
private Long idSchool; 

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.school") 
private List<FirstTable> firstTables; 
} 

FirstTable

@Entity 
@Table(name = "FirstTable") 
@AssociationOverrides({ @AssociationOverride(name = "pk.school", joinColumns = @JoinColumn(name = "idSchool")), 
    @AssociationOverride(name = "pk.address", joinColumns = @JoinColumn(name = "idAddress")), 
    @AssociationOverride(name = "pk.place", joinColumns = @JoinColumn(name = "idPlace")) }) 
public class FirstTable implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
protected FirstTablePK pk = new FirstTablePK(); 
} 

FirstTablePK

@Embeddable 
public class FirstTablePK implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
@ManyToOne 
private Address address; 
@ManyToOne 
private Place place; 
@ManyToOne 
private School school; 
} 

上記テーブルと完全に働いているジョイン。今度は、FirstTableとSecond Tableを結合したいと思います。

エンタープライズ

@Entity 
@Table(name = "Enterprise") 
public class Enterprise implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "idEnterprise") 
private Long idEnterprise; 

@OneToMany(フェッチ= FetchType.LAZY、カスケード= CascadeType.ALL、mappedBy = "pk.enterprise") プライベートリストsecondTables。 }

SecondTableでは、私はエンタープライズに接続するために同じロジックに従ってきました。 FirstTableとの接続のために私はこれを試してみた:

@Entity 
@Table(name = "SecondTable") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.firstTable", joinTable = @JoinTable(
       name = "FirstTable", inverseJoinColumns = { 
       @JoinColumn(name = "idSchool", referencedColumnName = "idSchool"), 
       @JoinColumn(name = "idAddress", referencedColumnName = "idAddress"), 
       @JoinColumn(name = "idPlace", referencedColumnName = "idPlace") })), 
     @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) }) 
public class SecondTable implements Serializable{} 

何かが、私はFirstTableテーブルにinverseJoinをやろうとしている、私の注釈で働いていません。コンパイルでこのエラーが表示されます。

"org.hibernate.AnnotationException: A component cannot hold properties split into 2 different tables" 

MVの例を提供しようとしました。 おかげさまでありがとうございます。私は本当にあなたの助けが必要です。

答えて

0

数時間後に問題が解決するまでに多くの時間がかかります。実際、私が最初に考えていたより簡単な解決策でした。

ここでは、次のとおりです。

@AssociationOverride(name = "pk.firstTable", joinColumns = { 
      @JoinColumn(name = "idSchool"), 
      @JoinColumn(name = "idAddress"), 
      @JoinColumn(name = "idPlace") }), 
    @AssociationOverride(name = "pk.enterprise", joinColumns = @JoinColumn(name = "idEnterprise")) }) 
関連する問題