2017-04-04 220 views
1

我在项目中的实体之间的关系有问题,其中所有实体都有由3个字段组成的主键;复合键映射JPA +休眠

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; 

当我尝试实体实体只有每个实体的域代码的其他两个实体映射返回错误:

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

大概是因为初级组密钥是复合,有任何方式来做这种关系,而不必更改实体的主键?

enter image description here

回答

0

问题:

就像你在你的问题的问题来自于你的实体Id从三个columns组成和你是唯一一个在ManyToOne关系引用它事实上预测,在@JoinColumn注释中。

解决方案:

所以你不必改变你的实体主键,但你应该在你的ManyToOne映射包括三种连接列,而不是一个。

你应该从两个关系改变:

@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列作为维护注册表完整性的关键 –