在休眠中加入复合主键的某个属性

jmo*_*ira 5 java persistence hibernate jpa composite-key

我正在使用休眠,并且我有两个表(遗留的,它们无法重组),如下所示

表A

@Entity
@Table(name = "tableA")
public Class TableA implements Serializable {
    @EmbeddedId private TableAId tableAId;

    @OneToOne(mappedBy = "tableA")
    private TableB tableB;

    // getters, setters, hashCode and equals ommited
}
Run Code Online (Sandbox Code Playgroud)

表A的复合ID

@Embeddable
public class TableAId implements Serializable {
    protected int id1;
    protected String id2;
    protected int id3;
    // getters, setters, hashCode and equals ommited
}
Run Code Online (Sandbox Code Playgroud)

表B

@Entity
public class TableB implements Serializable {
    @OneToOne
    @JoinColumn(name = "tableB", referencedColumnName = "id3")
    protected TableA tableA;
    // getters, setters, hashCode and equals ommited
}
Run Code Online (Sandbox Code Playgroud)

从上面的代码可以看出,我需要表 B 使用表的组合键的一个或多个(不是全部)属性来连接表 A。我已经尝试过以下三种方法但没有成功:

  1. 与上面的代码完全相同。
  2. 像这样更改referencedColumnName值

    referencedColumName = "tableAId.id3"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 TableA 的 pojo 实体中添加组合复合键的属性,如下所示:

    // TableA
    @Column(name = "id1", insertable = false, updatable = false)
    private Integer id1;
    
    Run Code Online (Sandbox Code Playgroud)

如果这可能的话?如果有任何帮助,我们将不胜感激!

Jam*_*esB 0

我认为 JPA 注释 @MapsId 可能适合您:

http://docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html

在 TableA 类中,尝试对 tableB 属性执行此操作:

@MapsId("id3")
@OneToOne(mappedBy = "tableA")
private TableB tableB;
Run Code Online (Sandbox Code Playgroud)

还要从 TableB 类的 tableA 属性中删除 @JoinColumn 注释。