在SQL中没有使用JoinColumn名称

时间:2010-04-28 11:59:08

标签: java jpa openjpa many-to-one

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

是否可以基于这样的引用建立关系(除了主键之外的列,没有数据库中的外键)?还有其他什么缺失吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

此外,没有约束也无所谓(如果我错了,请有人纠正我。)