hibernate - 使用连接表获取值,其中联合表中使用的键不是主键

时间:2014-06-30 10:10:03

标签: hibernate hibernate-mapping

我有三个A,B,C等级

public class A{
 @Id
 @Column(name = "id", insertable = false, updatable = false)
 private String id;

 @Column(name = "bid", insertable = false, updatable = false)
 String b_id
}

public class B{
 @id
 @Column(name = "id", insertable = false, updatable = false)
 private String id;

 @Column(name = "cid", insertable = false, updatable = false)
 String c_id;
 }

public class C{
 @Id
 @Column(name = "id", insertable = false, updatable = false)
 private String id;

 @Column(name = "property", insertable = false, updatable = false)
 private String property
 }

我想在一个选择来自A Hibernate pojo c.property

我注意到我无法使用@JoinTable来实现它,因为B主键不是&的组合。 c键。

我考虑过做下一个:

  1. @loader与namedQuery一起使用。这似乎是一个坏主意,我想在每个选择表将创建namedQuery

    @Entity
    @Table(name = "A&B&C")
    @Loader(namedQuery = "all")
    @NamedNativeQuery(name = "all", query = "select * from A a join B b on a.bid = a.aid join C c on b.cid = c.id )
    
  2. 使用@SecondaryTables有可能吗? 3?

  3. 还有其他好的解决方案吗?

    10倍。

1 个答案:

答案 0 :(得分:0)

您不应将其他实体的ID作为实体的字段。看起来你应该简单地在A和B之间有一个ManyToOne(几个As表示相同的B),以及B和C之间的ManyToOne(几个B指的是相同的C)。

所以你应该在A中代替b_id

@ManyToOne
@JoinColumn(name = "bid")
private B b;

同样地,在B:

@ManyToOne
@JoinColumn(name = "cid")
private C c;

现在,当你想要获得A的属性时,你只需要调用

String property = a.getB().getC().getProperty();