【问题标题】:hibernate - taking value using join table where the key used in the joint table is not primery keyhibernate - 使用连接表获取值,其中连接表中使用的键不是初级键
【发布时间】:2014-06-30 19:56:17
【问题描述】:

我有三个 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 主键不是 a 和 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 ?

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

10 倍。

【问题讨论】:

    标签: hibernate hibernate-mapping


    【解决方案1】:

    您不应将其他实体的 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();
    

    【讨论】:

    • 我无法更改 B 和 C
    猜你喜欢
    • 2018-01-08
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多