Java sql中未使用JoinColumn名称

Java sql中未使用JoinColumn名称,java,jpa,openjpa,many-to-one,Java,Jpa,Openjpa,Many To One,在数据库中没有设置精确的外键约束的情况下,我无法映射多对一关系。我在MySql数据库中使用OpenJPA实现,但问题在于为insert和select语句生成的sql脚本 我有一个LegalEntity表,其中包含RootId列(以及其他列)。我还有一个地址表,它的LegalEntityId列不可为空,应该包含引用LegalEntity的“RootId”列的值,但没有设置任何数据库约束(外键) 地址实体映射为: @Entity @Table(name="address") public clas

在数据库中没有设置精确的外键约束的情况下,我无法映射多对一关系。我在MySql数据库中使用OpenJPA实现,但问题在于为insert和select语句生成的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语句(获取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]
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=...]
如果我忽略了上述语句中的表属性,则会生成:

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未包含在任何声明中

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


提前感谢。

尝试将FetchType更改为eager。OpenJPA不应该查询LegalEntity,直到调用getLegalEntity请求它


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

没有发生任何事情,它仍然生成相同的sql。您可以编写“任何语句中都不包含LegalEntityId”。就在这上面有一条语句
selectt0.Id。。。从t0.LegalEntityId=t1.RootId…
上的地址t0内部连接legalentity t1。LegalEntityId将出现在该联接条件中。那你是什么意思?我不明白。对不起,我的意思是,SELECT和INSERT语句中没有包含LegalEntityId作为列(即INSERT INTO address(…,LegalEntityId)值(…)。好的,谢谢。能否显示
LegalEntity
的类定义、完整生成的SQL,以及在实体上创建并执行
persist()
merge()
的代码?顺便说一下,删除属性
table=“LegalEntity”
是正确的。该属性设置将强制列“LegalEntityId”进入表“LegalEntity”。但是您说它属于table
address
,这是缺少
table
属性时的默认值。