【问题标题】:hibernate one to one join using primary key not working使用主键休眠一对一连接不起作用
【发布时间】:2017-08-09 12:23:05
【问题描述】:

我在休眠 A 和 B 中有 2 个实体。这是相关代码。

@Entity
public class A {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @OneToOne(mappedBy = "a", cascade = CascadeType.ALL)
    private B b;
}

@Entity
public class B {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "a_id")
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "a"))
    private Integer aId;

    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @PrimaryKeyJoinColumn
    private A a;
}

我做了与下面提到的链接中提到的相同的事情 one to one mapping using primary key join column

但是,当我执行以下 hql 查询时,

"from A a left join a.b"

在以下条件下进行连接

a.id = b.id 

虽然我想要的是以下条件

a.id = b.aId

【问题讨论】:

  • 能否将我的回复标记为答案?

标签: java hibernate join one-to-one


【解决方案1】:

您必须使用@JoinColumn(name = "a_id") 而不是@PrimaryKeyJoinColumn。 顺便说一句,您不能在同一列上定义两个字段。但是,如果您需要这样做,则必须使其中一个不可插入且不可更新,如下所示:

@JoinColumn(name = "a_id", insertable = false, updatable = false)

【讨论】:

    【解决方案2】:

    您已将 A 类的引用提供给 B 类中的字段 a。

    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @PrimaryKeyJoinColumn
    private A a;
    

    和B类到A类中的字段b

    @OneToOne(mappedBy="a", cascade=CascadeType.ALL)
        private B b;
    

    所以默认情况下 Hibernate 创建一个带有引用字段的连接查询。所以默认情况下休眠在a.id = b.id 上执行连接。 但我认为您可以创建自己的查询并使用本机查询与a.id = b.aId 执行联接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多