2017-04-04 10 views
1

すべてのエンティティが3つのフィールドで構成されるプライマリキーを持つプロジェクトのエンティティ間の関係に問題があります。コンポジットキーマッピングJPA + Hibernate

Product(**ck_del, cod_empresa, codigo**, description, cod_group, cod_tax); 
Group(**ck_del, cod_empresa, codigo**, description); 
Tax(**ck_del, cod_empresa, codigo**, description); 

//Mapping in the entity PRODUCT 
@ManyToOne 
@JoinColumn(name="COD_GROUP" , referencedColumnName="CODIGO") 
private Group group; 

@ManyToOne 
@JoinColumn(name="COD_TAX" , referencedColumnName="CODIGO") 
private Tax tax; 

私は各エンティティのフィールドコードにより、他の2つのエンティティとエンティティのエンティティをマップしようとエラーを返します:プライマリグループキーを配合しているため、おそらく

referencedColumnNames(CODIGO) of models.Product.group referencing models.Group not mapped to a single property

があり、エンティティの主キーを変更することなくこの関係を行う方法はありますか?

enter image description here

答えて

0

問題:あなたのような

は、あなたの質問に問題があなたのエンティティIdは3 columnsから構成されており、あなたがManyToOne関係に一つだけで、それを参照しているという事実に由来して予測しました、@JoinColumn注釈に記載されています。

ソリューション:

つまり、あなたのエンティティの主キーを変更する必要はありませんが、次の3つの結合列の代わりに、あなたのManyToOneマッピングの1を参照する必要があります。

あなたは両方から関係の中でそれを変更する必要があります。次のよう

@ManyToOne 
@JoinColumn(name="COD_TAX" , referencedColumnName="CODIGO") 
private Tax tax; 

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="COD_TAX" , referencedColumnName="CODIGO"), 
    @JoinColumn(name="CK_DEL" , referencedColumnName="CK_DEL"), 
    @JoinColumn(name="CODE_EMPRESA", referencedColumnName="CODE_EMPRESA") 
    }) 
private Tax tax; 
+0

問題は関係が参照のみCOD_GROUP + COD_EMPRESAによって行われていることである CK_DEL属性が一般的ですすべてのエンティティに割り当てられ、各テーブルのレコードごとに一意です。 –

+0

@ BrunoC。すべてのエンティティに共通する*なぜ主キーで使用するのですか? –

+0

レジストリの整合性を維持するためのキーとしてck_del列が必要 –