第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

spring-data-jpa如何在特定的時(shí)候獲取lazy加載的數(shù)據(jù)

spring-data-jpa如何在特定的時(shí)候獲取lazy加載的數(shù)據(jù)

收到一只叮咚 2019-03-01 10:40:24
比如說我有兩個(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,可以直接使用。

不知道有沒有更好的方案。

查看完整回答
反對 回復(fù) 2019-03-01
?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊

我覺得是session過期的原因,你試試不用JPA findOne 查詢,改用手寫hql,session.query() 試試看。

查看完整回答
反對 回復(fù) 2019-03-01
  • 2 回答
  • 0 關(guān)注
  • 1337 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號