比如說我有兩個(gè)實(shí)體EntityA, EntityB,是多對多關(guān)系,并且互相指定默認(rèn)使用Lazy加載
@Entity
public class EntityA implements Serializable {
...
@ManyToMany(fetch = FetchType.LAZY)
private List<EntityB> entityBList = new ArrayList<>();
...
}
@Entity
public class EntityB implements Serializable {
...
@ManyToMany(mappedBy = "entityBList", fetch= FetchType.LAZY)
private List<EntityA> entityAList = new ArrayList<>();
...
}
在做單元測試的時(shí)候,如果通過A獲取B的List,會拋出LazyInitializationException
@Test
public void test() throws Exception {
EntityA a = dao.findOne(id);
List<EntityB> bList = a.getEntityBList();
bList.size(); // 這里拋出異常
}
如果在@Test下加上@Transactional倒是可以但是如果把find方法提出來作為一個(gè)新方法調(diào)用,則又不行了。。。
@Test
public void test() throws Exception {
this.getAwithLazyData();
}
@Transactional
public void getAwithLazyData(id) {
EntityA a = dao.findOne(id);
List<EntityB> bList = a.getEntityBList();
bList.size(); // 這里仍然拋出異常
}
當(dāng)然,如果將fetch= FetchType.LAZY改為fetch= FetchType.EAGER是不會拋異常不過每次查詢就都會帶出關(guān)聯(lián)數(shù)據(jù)了。。。但我只想在特定的時(shí)候帶出關(guān)聯(lián)數(shù)據(jù),請問應(yīng)該怎么處理。。。
2 回答

烙印99
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
在找了一些資料之后,發(fā)現(xiàn)了一個(gè)解決方法,換了一個(gè)思考方向
該方法在spring-boot 1.5.6中測試通過
使用@NamedEntityGraph
相關(guān)注解
Entity上:
@Entity @NamedEntityGraph(name?=?"EntityA.lazy",?attributeNodes?=?{@NamedAttributeNode("entityBList")}) public?class?EntityA?implements?Serializable?{ ????... ????@ManyToMany(fetch?=?FetchType.LAZY) ????private?List<EntityB>?entityBList?=?new?ArrayList<>(); ????... }
對應(yīng)的Dao上:
@Repository public?interface?EntityADao?extends?SimpleJpaRepository<EntityA,?Long>?{ ????@EntityGraph(attributePaths?=?{?"entityBList"?}) ????EntityA?findWithEntityBById(Long?id); }
這樣,如果調(diào)用的是原本的findOne
方法,則查詢結(jié)果中的entityBList為lazy數(shù)據(jù),無法取出。
如果調(diào)用findWithEntityBById
方法,則查詢結(jié)果中已經(jīng)帶出了entityBList,可以直接使用。
不知道有沒有更好的方案。

慕婉清6462132
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
我覺得是session過期的原因,你試試不用JPA findOne 查詢,改用手寫hql,session.query() 試試看。
添加回答
舉報(bào)
0/150
提交
取消