2013-09-26 41 views
0

我對Hibernate處理插入JoinTable的方式感到困惑。優化Spring-data/Hibernate ManyToMany插入

我需要在JoinTable一些額外的領域,所以我選擇了很常見的方式,爲JoinTable創建@Entity並使用@OneToMany@ManyToOne。由於關係應該是唯一的,我在JoinTable-Entity中創建了一個@EmbeddedId

讓我們稱之爲類ABAB

@Entity 
public class A implements Serializable { 
    @OneToMany(mappedBy="a", cascade=CascadeType.ALL, orphanRemoval=true) 
    private Set<AB> abs;   
} 

@Entity 
public class B implements Serializable { 
    @OneToMany(mappedBy="b", cascade=CascadeType.ALL, orphanRemoval=true) 
    private Set<AB> abs;   
} 

@Entity 
public class AB implements Serializable { 
    @Embeddable 
    public static class Id implements Serializable { 
     UUID aId; 
     UUID bId; 

     public Id(UUID aId, UUID bId) { 
      this.aId = aId; 
      this.bId = bId; 
     } 
    } 

    public AB(A a, B b) { 
     this.id.aId = a.getId(); 
     this.id.bId = b.getId(); 
     this.a = a; 
     this.b = b; 
    } 

    @EmbeddedId 
    private Id id;  

    @MapsId("aId") 
    @ManyToOne 
    @JoinColumn(nullable=false, updatable=false) 
    private A a; 

    @MapsId("bId") 
    @ManyToOne 
    @JoinColumn(nullable=false, updatable=false) 
    private B b;   
} 

我公地的情況是,我要到JoinTable插入多個新條目。所以我有一個A_id和多個B_ids。在普通的SQL中,我只需執行一個查詢即可完成所有工作。如果關係確實已經存在,數據庫將會拋出一個錯誤。

與Hibernate我需要:

  1. SELECT:給我一個ID A類的實例= A_id
  2. SELECT:給我一個ID = B_id1或ID = B_id2B類的一個實例...
  3. 創建類AB的新實例並設置複合主鍵並保存AB

最後步驟產生(對於每個AB):

  1. SELECT * FROM AB其中A_ID = ...和B_ID = ...
  2. 插入到AB(AID,BID)的值(。 ..,...)

這是我的代碼。使用Spring數據JPA(JpaRepository):

A a = aRepo.findOne(aId); 
List<B> bs = bRepo.findAll(bIdList); 
for(B b : bs) { 
    AB ab = new AB(a, b); 
    abRepo.save(ab); 
} 
groupUserRepo.flush(); 

,如果我只是創建具有AB對象的新ArrayList和事後保存所有這些一次,或者如果我這樣做在上面的代碼不要緊。它總是爲每個對象進行選擇和插入。

有沒有辦法用較少的查詢做到這一點?

+0

http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns有一些有用的信息。 –

+0

Hibernate必須執行的附加查詢沒有任何問題 –

回答

0

這是奇怪的,因爲你看到的是一個分離對象的行爲saveOrUpdate。 我希望休眠發出選擇AB如果他們是分離的對象,但不是AB,因爲你打電話save

你可以試試persist看看它是否改變任何東西。

+0

謝謝你的回答。問題是:我使用的是spring-data-jpa,它不提供持久化或合併等方法。它只有'save'和'saveAndFlush'。 –

+0

嘗試實施Persistable。請參閱http://docs.spring.io/spring-data/jpa/docs/1.4.1.RELEASE/reference/html/jpa.repositories.html#jpa.entity-persistence.saving-entites –