1

我在映射多对一关系时遇到问题,而数据库中没有设置确切的外键约束。我将 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 不包含在任何语句中。

是否可以基于这种引用建立关系(到主键以外的列,数据库中没有外键)?还缺少什么吗?

提前致谢。

4

1 回答 1

0

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

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

于 2010-04-28T12:08:39.723 回答