Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate jpa中复合主键上的一对一连接_Hibernate_Jpa - Fatal编程技术网

Hibernate jpa中复合主键上的一对一连接

Hibernate jpa中复合主键上的一对一连接,hibernate,jpa,Hibernate,Jpa,我有两张桌子。一个是主键,另一个是复合键 表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 regionNa

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

表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;
}
表B的复合键:

@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中尝试了下面的代码片段(一对一连接)


但它表示无效的列secondaryId。跟这个打了一天。无法使用组合键中的主键联接表。任何帮助都将不胜感激。

如果是复合密钥,您需要使用复合密钥对象访问它,如下所示:

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

您应该修改
表B
以使用“派生标识”:


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

我已经尝试过了。正在引发异常“无效列secondaryId”。因为TableB包含复合键,所以它正在寻找第二列。但是TableA没有复合键。它只有主键“myId”@ishantgI找到了一个与您的问题类似的解决方案。也许这有助于解决上述问题。不过我还是遇到了同样的异常“Invalid column secondaryId”这是一个有效的解决方案:非常感谢@Brian Vosburgh。我已经试过了解决办法。它完全符合我的要求。太好了!:)如果你有时间,你能接受我的回答吗@用户3016222
 @OneToOne(cascade = CascadeType.ALL)
 @JoinTable(name = "TableA", inverseJoinColumns = @JoinColumn(name = 
 "compositePK.myId", referencedColumnName = "myId"))
 private TableA tableA;
@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;
}