【问题标题】:Hibernate - Eager load just the proxies for manytomanyHibernate - 只为多线程加载代理
【发布时间】:2013-05-31 21:55:37
【问题描述】:

我有两个通过连接表连接的表:

@Entity
@Table( name = "a" )
public class A {
    @Id
    @Column( name = "id", unique = true, nullable = false )
    private long id;

    @ManyToMany( targetEntity = B.class )
    @JoinTable( name = "a_b_join", joinColumns = @JoinColumn( name = "a_id" ), inverseJoinColumns = @JoinColumn( name = "b_id" ) )
    private Set<B> bs = new HashSet<B>();
}

@Entity
@Table( name = "b" )
public class B {
    @Id
    @Column( name = "id", unique = true, nullable = false )
    private long id;
}

数据库中有大量的A,而B 的数量相对较少。大多数A只有一个B,但可能有几个。对于任何给定的 A 的结果集,将只有少数不同的 B。急切地加载多对多将导致一次又一次地获取相同的 B。我要做的是让 Hibernate 从初始 SELECT 的连接表中获取 A 的 B 的所有 id,并用代理填充“bs”集合。那么每个 B 在会话中只会被获取一次。

一种适用于我的应用程序的替代方法是以某种方式急切地从连接表中加载 B id 集合。

【问题讨论】:

    标签: hibernate many-to-many jointable


    【解决方案1】:

    我认为这是不可能的。

    另一种方法是将连接表映射为一个实体(我们称之为ABJoin),将ManyToMany 替换为针对Set&lt;ABJoin&gt; 的OneToMany,然后急切地获取该集合。因此,您将拥有一组加载的 ABJoin,每个都有一个未初始化的 B 代理。

    【讨论】:

    • 这正是我在等待回复时决定实施的。我通常不喜欢为连接表创建实体类,但这可以达到目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多