我在映射多对一关系时遇到问题,但没有在数据库中设置确切的外键约束。我使用OpenJPA实现MySql数据库,但问题是生成的SQL脚本插入和选择语句。在sql中未使用JoinColumn名称
我有LegalEntity表,其中包含RootId列(等)。我也有地址表,其中有LegalEntityId列不可为空,它应该包含引用LegalEntity的“RootId”列但没有设置任何数据库约束(外键)的值。
地址实体映射:
@Entity
@Table(name="address")
public class Address implements Serializable {
...
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(referencedColumnName="RootId", name="LegalEntityId", nullable=false, insertable=true, updatable=true, table="LegalEntity")
public LegalEntity getLegalEntity() {
return this.legalEntity;
}
}
SELECT语句(取LegalEntity的地址时),然后插入statment产生:
SELECT t0.Id, .., t0.LEGALENTITY_ID FROM address t0 WHERE t0.LEGALENTITY_ID = ? ORDER BY t0.Id DESC [params=(int) 2]
INSERT INTO address (..., LEGALENTITY_ID) VALUES (..., ?) [params=..., (int) 2]
如果我省略生成从上述报表表格属性:
SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId WHERE t1.Id = ? ORDER BY t0.Id DESC [params=(int) 2]
INSERT INTO address (...) VALUES (...) [params=...]
因此,LegalEntityId不包含在声明。
是否有可能根据这种引用建立关系(除了主键以外,没有数据库中的外键)?还有其他什么遗漏吗?
在此先感谢。
您写的“LegalEntityId不包含在任何声明中”。在这之上,你有'SELECT t0.Id,... FROM地址t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...'语句。 LegalEntityId显示在JOIN条件中。所以你是什么意思?我不明白。 – 2010-04-28 19:45:39
对不起,我的意思是LegalEntityId不包含在SELECT和INSERT语句中作为列(即INSERT INTO地址(...,LegalEntityId)VALUES(...))。 – Vladimir 2010-04-29 06:43:50
好的,谢谢。您能否显示'LegalEntity'的类定义,完整生成的SQL以及代码创建,然后在实体上执行persist()或merge()?顺便说一句,你删除属性'table =“LegalEntity”'是正确的。该属性设置会强制列“LegalEntityId”到“LegalEntity”表中。但是你说它属于table'address',这是缺少'table'属性的缺省值。 – 2010-04-30 00:58:01