【问题标题】:one to one join on composite primary key in jpajpa中复合主键的一对一连接
【发布时间】:2018-10-05 13:18:48
【问题描述】:

我有两张桌子。一个是主键,另一个是复合键。

表A:

@Entity
@Table(name = "TableA")
public class TableA {

    @Id
    @Column(name = "myId")
    private Long id;

    @Column(name = "myName")
    private String name;

    @Column(name = "myRegion")
    private String regionName;
}

TableB 的复合键:

@Embeddable
public class CompositePK implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "myId", insertable=false, updatable=false)
    private Long myId;

    @Column(name = "secondaryId")
    private String secondaryId;

}

表B:

@Entity
@Table(name = "TableB")
public class TableB {

    @EmbeddedId
    private CompositePK compositePK;

    @Column(name = "Data")
    private String regulationText;
}

现在我要实现查询

select * from TableA tableA 
        inner join TableB tableB 
        on tableA.myId=tableB.myId
        where tableB.myId = 1;

我在 TableB 中尝试了以下 sn-p(一对一连接)。

@OneToOne(cascade = CascadeType.ALL)
    @JoinTable(name = "TableA", inverseJoinColumns = @JoinColumn(name = "myId", referencedColumnName = "myId"))
    private TableA tableA;

但它说无效列secondaryId。就这样折腾了一天。无法使用复合键中的主键连接表。任何帮助将不胜感激。

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    在复合的情况下,您需要使用复合键对象访问它,如下所示:

     @OneToOne(cascade = CascadeType.ALL)
     @JoinTable(name = "TableA", inverseJoinColumns = @JoinColumn(name = 
     "compositePK.myId", referencedColumnName = "myId"))
     private TableA tableA;
    

    【讨论】:

    【解决方案2】:

    您应该修改TableB 以使用“派生身份”:

    @Entity
    @Table(name = "TableB")
    public class TableB {
    
        @EmbeddedId
        private CompositePK compositePK;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "myId", referencedColumnName = "myId")
        @MapsId("myId") // maps 'myId' attribute of embedded id CompositePK
        private TableA tableA;
    
        @Column(name = "Data")
        private String regulationText;
    }
    

    在 JPA 2.1 规范的第 2.4.1 节中讨论了派生的身份(带有示例)。

    【讨论】:

    • 非常感谢@Brian Vosburgh。我已经尝试了解决方案。它完全符合我的要求。
    • 太棒了! :) 如果你有时间,你能接受我的回答吗? @user3016222
    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2013-06-07
    • 2021-08-11
    相关资源
    最近更新 更多