我在映射多对一关系时遇到问题,而数据库中没有设置确切的外键约束。我将 OpenJPA 实现与 MySql 数据库一起使用,但问题在于为插入和选择语句生成的 sql 脚本。
我有 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 语句(当获取法人实体的地址时)和 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]
如果我从提到的语句中省略表属性,则会生成:
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 不包含在任何语句中。
是否可以基于这种引用建立关系(到主键以外的列,数据库中没有外键)?还缺少什么吗?
提前致谢。