2010-04-28 19 views
1

我在映射多对一关系时遇到问题,但没有在数据库中设置确切的外键约束。我使用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不包含在声明。

是否有可能根据这种引用建立关系(除了主键以外,没有数据库中的外键)?还有其他什么遗漏吗?

在此先感谢。

+0

您写的“LegalEntityId不包含在任何声明中”。在这之上,你有'SELECT t0.Id,... FROM地址t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...'语句。 LegalEntityId显示在JOIN条件中。所以你是什么意思?我不明白。 – 2010-04-28 19:45:39

+0

对不起,我的意思是LegalEntityId不包含在SELECT和INSERT语句中作为列(即INSERT INTO地址(...,LegalEntityId)VALUES(...))。 – Vladimir 2010-04-29 06:43:50

+0

好的,谢谢。您能否显示'LegalEntity'的类定义,完整生成的SQL以及代码创建,然后在实体上执行persist()或merge()?顺便说一句,你删除属性'table =“LegalEntity”'是正确的。该属性设置会强制列“LegalEntityId”到“LegalEntity”表中。但是你说它属于table'address',这是缺少'table'属性的缺省值。 – 2010-04-30 00:58:01

回答

0

尝试将您的FetchType更改为渴望。在通过调用getLegalEntity请求之前,OpenJPA不应查询LegalEntity。

此外,没有约束应该不重要(有人请纠正我,如果我错了)。

+0

什么都没发生,它仍然产生相同的SQL。 – Vladimir 2010-04-28 13:04:18

相关问题