我在映射多对一关系时遇到问题,而没有在数据库中设置精确的外键约束。我使用OpenJPA实现与MySql数据库,但问题是生成的插入和选择语句的SQL脚本。
我有LegalEntity表,其中包含RootId列(以及其他)。我还有Address表,其中 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的地址时)和INSERT语句:
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]
如果我从所提到的语句中省略了table属性:
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 :(得分:0)
尝试将您的FetchType更改为渴望。在通过调用getLegalEntity请求之前,OpenJPA不应查询LegalEntity。
此外,没有约束也无所谓(如果我错了,请有人纠正我。)