我對Hibernate處理插入JoinTable的方式感到困惑。優化Spring-data/Hibernate ManyToMany插入
我需要在JoinTable一些額外的領域,所以我選擇了很常見的方式,爲JoinTable創建@Entity
並使用@OneToMany
和@ManyToOne
。由於關係應該是唯一的,我在JoinTable-Entity中創建了一個@EmbeddedId
。
讓我們稱之爲類A
,B
和AB
:
@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我需要:
SELECT
:給我一個IDA
類的實例=A_id
SELECT
:給我一個ID =B_id1
或ID =B_id2
或B
類的一個實例...- 創建類
AB
的新實例並設置複合主鍵並保存AB
最後步驟產生(對於每個AB
):
- SELECT * FROM AB其中A_ID = ...和B_ID = ...
- 插入到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和事後保存所有這些一次,或者如果我這樣做在上面的代碼不要緊。它總是爲每個對象進行選擇和插入。
有沒有辦法用較少的查詢做到這一點?
http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns有一些有用的信息。 –
Hibernate必須執行的附加查詢沒有任何問題 –