2016-04-26 7 views
0

2つのテーブル間に1対多のjpa 2.x関係があるかどうかを知りたいと思います。私はこのような何かを探しています: (私は成功せずに同様のシナリオを見つけるためにグーグルで多くのことを検索したい)JPA 2.x単方向1対多リレーション

CUSTOMER 
ID NAME RELATEDCOLORS 
1 John 10 
2 Albert 20 
3 Maria 10 
4 Smith null 

COLORS 
ID FATHERID COLOR 
1 10   Red 
2 10   Green 
3 10   Blu 
4 20   Cyan 

あなたは一人一人が対応する色を持って見ることができるように。したがって、ジョンとマリアの色は赤、緑、青です。アルバートの場合、色はシアン、スミスは色がありません。

私はこのような何か試してみました

:iRelatedColors属性は

nullにすることができますので、私は "ロングiRelatedColors" の代わりに "長いiRelatedColors" を使用していた

Customerエンティティ

.... 
@Id 
@Column(name = "ID", nullable = false) 
private long iId; 
@Column(name = "NAME") 
private String iName; 
@Column(name = "RELATEDCOLORS", nullable = true) 
private Long iRelatedColors; 
@JoinColumn(name = "FATHERID",referencedColumnName="RELATEDCOLORS", nullable=true) 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private List<Colors> iColors; 
.... 

注意を色の実体

.... 
@Id 
@Column(name = "ID", nullable = false) 
private long iId; 
@Column(name = "FATHERID", nullable = false) 
private long iFatherId; 
@Column(name = "COLOR") 
private String iColor; 
.... 

私はIKEが、私は必要なものの色エンティティ

タイプの顧客の属性を持つことです。

顧客をリードすると、私は対応するgetを呼び出したときに、リストのiColorが移入されている必要があり
  • ...メソッド

  • iColorsリストの変更後に顧客を更新する場合(たとえば、新しい色を追加する、または色を削除する場合) 色のエンティティも更新する必要があります。

そして私は私がする場合にのみ必要なものすべてがあります。RELATEDCOLORS列が一意の番号(例:10、20、30,40 ECC)を用いて充填されたCustomerテーブル内

  • CustomerテーブルのRELATEDCOLORS列は常にnullでなくてはなりません.Colorsテーブルに対応するIDがある場合は重要ではありません。 RELATEDCOLORS列にCUSTOMER行の1つにnull値がある場合、実行時にHibernateによってNullPointerExceptionがスローされます。

私があなたに示しているデータを使用してもうまくいかず、わかりません。

ご協力いただきありがとうございます。

+0

あなたがいないので、もし明確に、色にFKを追加しますOneToManyのあなたのマッピングそのようなマッピングを削除し、OneToOne/ManyToOneを置くと、FKはCustomerになります。 –

+0

Customer> Coloursという関係の形式は明らかに@ManyToOneなので、なぜあなたは@OneToManyとしてマップしようとしていますか? –

+0

皆さん、ありがとうございました。 ニール、より具体的にお聞かせください。 テーブルデータからわかるように、Customers> Colorsの関係はOneToManyです。たとえば、Jhonは赤、緑、青の色を持っています ありがとう – gpezzini

答えて

0

モデルにはあま​​りにも多くの矛盾が含まれていますが、実際にはあまり一般的ではありません。 Johnの色がGreen, Blue and Cyanの場合はどうしますか?これは、フィールドRELATEDCOLORSはテーブルがない限り、このようなCOLORS利益より多くのデータを評価できないことを、意味するであろう、まだ色Red, Green and BlueMariaがあるため:

COLORS 
ID FATHERID COLOR 
1 10   Red 
2 10   Green 
3 10   Blue 
4 20   Cyan 
5 30   Green 
6 30   Blue 
7 30   Cyan 

これは、冗長データの多くになります。 Colorテーブルは実際にはほとんどが結合テーブルのように見えますが、そうではありません。 これに加えて、OneToMany-Relationは追加の結合表です。

ただ、次のように一方向のOneToManyとしてあなたの色をマッピングし、色の顧客でRELEATEDCOLORSFATHERIDを取り除く:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
@JoinTable(name="CUSTOMER_COLORS", joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName="iId")}, inverseJoinColumns={@JoinColumn(name="COLOR_ID", referencedColumnName="iId")}) 
private List<Color> iColors; 
関連する問題