2014-09-03 33 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