首页 > 解决方案 > JPA @ManyToOne 连接列名时的场景在两个表中是相同的

问题描述

当实体关系之间的列同名时,@JoinColumn 配置应该是什么?

例如,使用下面的两个表:

create table DOG
(
    DOG_ID   NUMBER generated as identity primary key,
    NAME     VARCHAR2(50) not null,
    OWNER_ID NUMBER constraint FK_OWNER_ID references OWNER
)

create table OWNER
(
    OWNER_ID   NUMBER generated as identity primary key,
    FIRST_NAME VARCHAR2(50) not null,
    LAST_NAME  VARCHAR2(50) not null
)

// DogEntity.java
private OwnerEntity owner;

@ManyToOne()
@JoinColumn(name = "OWNER_ID", foreignKey = @ForeignKey(name = "FK_OWNER_ID"))
public OwnerEntity getOwner() {
   return owner;
}

public void setOwner(OwnerEntity ownerEntity) {
   this.owner = ownerEntity;
}

DOG.OWNER_ID是返回所有者表的外键。 OWNER.OWNER_ID是 Owner 表的主键。

这是当前公司遵循的命名约定,我已经尝试了 @JoinColumn 配置的几种变体,但我似乎无法完全正确。我尝试过的一切都会导致错误,例如无法创建持久性单元。

CWWJP0015E: An error occurred in the org.hibernate.jpa.HibernatePersistenceProvider persistence provider when it attempted to create the container entity manager factory for the api-unit persistence unit

使用此配置:

@ManyToOne()
@JoinColumn(name = "OWNER_ID", referencedColumnName = "OWNER_ID")
public OwnerEntity getOwner() {

我最终得到与上述相同的错误。理想情况下,我想更改列的名称,但这是不可行的。

我发现的可能解决方案是:

@JoinColumn(name = "owner_id", referencedColumnName = "OWNER_ID")

输出是:

Hibernate: 
    select
         dogentity0_.DOG_ID as dog_id1_0_0_,
         dogentity0_.NAME as name2_0_0_,
         dogentity0_.owner_id as owner_id3_0_0_,
         ownerentit1_.OWNER_ID as owner_id1_1_1_,
         ownerentit1_.FIRST_NAME as first_name2_1_1_,
         ownerentit1_.LAST_NAME as last_name3_1_1_
     from
         APP.DOG dogentity0_
     left outer join
         APP.OWNER ownerentit1_
             on dogentity0_.owner_id=ownerentit1_.OWNER_ID
     where
         dogentity0_.DOG_ID=?

它有效,但它看起来很老套,很容易被忽视。我认为休眠版本并不重要,但以防万一。我在用5.4.30.Final

标签: hibernatejpa

解决方案


推荐阅读