Java sql中未使用JoinColumn名称
在数据库中没有设置精确的外键约束的情况下,我无法映射多对一关系。我在MySql数据库中使用OpenJPA实现,但问题在于为insert和select语句生成的sql脚本 我有一个LegalEntity表,其中包含RootId列(以及其他列)。我还有一个地址表,它的LegalEntityId列不可为空,应该包含引用LegalEntity的“RootId”列的值,但没有设置任何数据库约束(外键) 地址实体映射为: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
@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”。但是您说它属于tableaddress
,这是缺少table
属性时的默认值。