解决单向OneToMany关系的问题

时间:2014-09-03 00:27:27

标签: hibernate jpa-2.0 hibernate-mapping hibernate-criteria

我正在使用遗留代码。我有entity Aentity B类,但由于entity B被引用了很多地方,我尝试不对entity B进行更改。以下是这两个实体的类。 Entity B有一个外键列,它是entity A的主键,在数据库表中,外键(aId)与表b(id)的许多主键相关联。

我需要的是A的集合(id范围在1到10000之间),其中包括当我对table_a进行查询时对应于辅助的B的集合。当前实现首先获取A(具有大量行)的集合,然后循环遍历集合中的每个A,然后调用dao.findB(aId)为A设置B的集合。它导致多次访问数据库。我尽量减少这次旅行。例如,如果A有50,000行,则dao.findB(aId)将被调用50,000次。

table_b
----------
id   table_a_id
1     2
2     2
3     2
4     3
5     3


 @Entity
 @Table(name = "table_a")
 public class A{
     private static final long serialVersionUID = 1L;

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id", unique = true, nullable = false) 
     private Long id;

 }


 @Entity
 @Table(name = "table_b")
 public class B{
     private static final long serialVersionUID = 1L;

     @Id
     @Column(name="id", unique = true, nullable = false)
     @GeneratedValue
     private Long id;

     @Column(name="table_a_id")
     private Long aId;

 }

2 个答案:

答案 0 :(得分:1)

如下所示

假设您有aid,您希望通过该Entity B加载A a = session.find(A.class,aid); // just some pseudo code Criteria cr = session.createCriteria(B.class); cr.add(Restrictions.eq("aId", aid)); List<B> results = cr.list();

{{1}}

答案 1 :(得分:0)

在链接How to define unidirectional OneToMany relationship in JPAhttp://en.wikibooks.org/wiki/Java_Persistence/OneToMany的帮助下,我在不更改实体B的情况下完成了工作。我确实检查了SQL日志,并节省了过多的数据库访问。

当我使用以下标准查询时,它返回了包含B集合的A的集合。

 Criteria criteria = session.createCriteria(A.class).add(Restrictions.in("id", ids)).setFetchMode("bSet", FetchMode.JOIN).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);              
            List<A> result = criteria.list();


@Entity
 @Table(name = "table_a")
 public class A{
     private static final long serialVersionUID = 1L;

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id", unique = true, nullable = false) 
     private Long id;

     @OneToMany
     @JoinColumn(name="table_a_id", referencedColumnName="id")  
     private Set<B> bSet = new HashSet<B> ();

 }


 @Entity
 @Table(name = "table_b")
 public class B{
     private static final long serialVersionUID = 1L;

     @Id
     @Column(name="id", unique = true, nullable = false)
     @GeneratedValue
     private Long id;

     @Column(name="table_a_id")
     private Long aId;

 }