要在另一个实体中引用的复合键的一个 Id

Chi*_*jib 2 java hibernate jpa

  • 表 1 只有两列构成组合键。
  • 正在生成表 2 id 列。
  • 我正在提供的 Table1 的一个属性的值,而对于第二个属性,我需要它来获取 Table2 的生成值。这是我迄今为止所拥有的-

复合主键:

public class PKClass implements Serializable
{
    private static final long serialVersionUID = -2092390836751020965L;
    public PKClass(){}
    public PKClass(long actId, long actAttId){
        this.actvId = actId;
        this.actvAtId = actAttId;
    }

    private long actvId;
    private long actvAtId;
    // getters, setters, equals, hashcode
}
Run Code Online (Sandbox Code Playgroud)

实体类 1:

@Entity @Table(name = "Table1")
@IdClass(PKClass.class)
public class AtLinkData implements Serializable
{
    @Id @Column(name = "ACT_ID", nullable = false)
    private long actvId;
    @Id @Column(name = "ACT_AT_ID")
    private long actvAtId;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, , mappedBy = "atLinkData")
    @JoinColumn(name = "ACT_AT_ID")
    private AtData atData;
    // getters, setters
}
Run Code Online (Sandbox Code Playgroud)

实体类 2:

@Entity @Table(name = "Table2")
public class AtData implements Serializable
{
    @TableGenerator(name = "somename", table = "sometable", pkColumnName = "somecolumn", valueColumnName = "valuename", pkColumnValue = "Table2", allocationSize = 1)
    @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "somename")
    @Column(name = "ACT_AT_ID")
    private Long id;
    // other variables
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ACT_AT_ID")
    private AtLinkData atLinkData;
    // getters setters
}
Run Code Online (Sandbox Code Playgroud)

我一直在尝试不同的东西,但是使用上面的代码,我收到了错误:

Caused by: org.hibernate.MappingException: broken column mapping for: atLinkData.id of: com.test.database.AtData
Run Code Online (Sandbox Code Playgroud)

Zaw*_* oo 5

@OneToOne(mappedBy="otherInfo") 使用JoinColumns注释 not JoinColumn

@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
    @JoinColumn(name = "ACTVID", referencedColumnName = "ACTVID"),
    @JoinColumn(name = "ACTVATID", referencedColumnName = "ACTVATID")
})
private AtLinkData atLinkData;  
Run Code Online (Sandbox Code Playgroud)

AtData实体的DB 表必须添加两个外键列ACTVIDACTVATID.

更新

如果您无法在 中添加新列Table 2,请mappedByAtData实体处使用属性,而不是AtLinkData。尝试如下。

AtLinkData.java

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ACT_AT_ID")
private AtData atData;
Run Code Online (Sandbox Code Playgroud)

数据文件

@OneToOne(fetch = FetchType.LAZY, mappedBy="atData")
private AtLinkData atLinkData;
Run Code Online (Sandbox Code Playgroud)