2014-09-03 32 views
0

我正在使用遗留代码。我有entity Aentity B类,但因为entity B被引用的地方很多,我尽量不做出entity B变化。以下是这两个实体的类。 Entity B具有外键列这是entity A的主键和在该数据库表中,外键(AID)与表b(id)的许多初级keies相关联。解决单向OneToMany关系的问题

我需要的是A(1之间ID范围 - 10000例如)的集合,其包括对应当我提出对表-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; 

} 

回答

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(); 
+0

@ user3123690不回答可以帮助你。 – 2014-09-03 04:41:55

+0

感谢您的回答。我认为我没有解释我的问题。我刚刚更新了它。你可以看一下吗? – user3123690 2014-09-03 13:52:36

+0

@ user3123690即使您在“实体A”内保留了“实体B”的引用,仍会获取相同的查询。替代方法可以是基于“A id”查询“实体B”。 – 2014-09-03 13:56:54

0

随着链接How to define unidirectional OneToMany relationship in JPAhttp://en.wikibooks.org/wiki/Java_Persistence/OneToMany的帮助下,我得到了它无需改变实体B.我做了检查SQL日志工作,它保存的过度访问数据库。

当我查询使用下列标准,它返回一个集合,其中包括B.

的收集
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; 

} 
+0

我测试了这个实现,发现这比调用dao.findB(aId)12,000次慢5倍。应用程序服务器和数据库都位于同一台机器上,调用数据库的次数在使用本地数据库时没有太大的差别。我结束了回去并使用dao.findB(aId)。就我而言,数据库始终是本地的。 – user3123690 2014-09-04 22:20:05