最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用jpa的時(shí)候set實(shí)體類(lèi)屬性自動(dòng)持久化的解決方案

 更新時(shí)間:2021年08月06日 08:43:21   作者:低調(diào)的洋仔  
這篇文章主要介紹了使用jpa的時(shí)候set實(shí)體類(lèi)屬性自動(dòng)持久化的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用jpa的時(shí)候set實(shí)體類(lèi)屬性自動(dòng)持久化

實(shí)例代碼

Set<User> users = new HashSet<User>();  
User user = null;  
for(int i = 0; i < 10; i++){  
    user = new User();  
    user.setUserName("wy" + i);  
    users.add(user);  
}  
Company company = userDao.getCompany();  
company.setUsers(users);  

當(dāng)使用了實(shí)體類(lèi)set屬性的時(shí)候,但是我們并沒(méi)有持久化,卻自動(dòng)保存到數(shù)據(jù)庫(kù)了。

原因

Hibernate分為三種基本的狀態(tài):游離態(tài)、自由態(tài)(臨時(shí)狀態(tài))、持久態(tài)。

持久化狀態(tài):與session關(guān)聯(lián)并且和在數(shù)據(jù)庫(kù)有數(shù)據(jù),已經(jīng)持久化了并且在數(shù)據(jù)庫(kù)的緩存當(dāng)中了。

我這里的這個(gè)對(duì)象應(yīng)該是持久化狀態(tài)的對(duì)象然后我直接構(gòu)造了一個(gè)user對(duì)象的set集合,同時(shí)對(duì)這個(gè)對(duì)象進(jìn)行set操作,那么緩存Session中的數(shù)據(jù)發(fā)生改變,那么接著數(shù)據(jù)庫(kù)也會(huì)跟著進(jìn)行相應(yīng)的改變。所以就執(zhí)行了update的更新操作。

解決辦法:

1.如果這個(gè)對(duì)象(例子中的company)本身不需要用的話(huà),可以直接new一個(gè)Company的對(duì)象出來(lái)然后再setUsers這個(gè)時(shí)候因?yàn)椴皇荢ession中的數(shù)據(jù),那么不會(huì)因?yàn)閷?duì)象的屬性發(fā)生改變而同步到數(shù)據(jù)庫(kù)中去。

2. 如果這個(gè)對(duì)象(例子中的company)要用的到,那么,在set之前可以先將其轉(zhuǎn)為游離態(tài),這樣的話(huà)會(huì)用到session的幾個(gè)方法:close、clear、evict。

close方法:關(guān)閉session這樣這個(gè)對(duì)象肯定是游離態(tài)了,因?yàn)閟ession已經(jīng)關(guān)閉了,但是往往我們實(shí)際的開(kāi)發(fā)過(guò)程中,session在后面是要用的到的,所以這個(gè)方法可行,但是不一定用得上,分清具體的情況。

clear方法:將session中的所有的對(duì)象全部清除出緩存,這個(gè)方式有點(diǎn)勞師動(dòng)眾,不過(guò)session清除了全部的對(duì)象之后自然就會(huì)變?yōu)橛坞x態(tài)了,這樣做不是很好吧我感覺(jué)。

evict方法:將某一個(gè)對(duì)象清除出緩存session,這個(gè)方法是很好的實(shí)現(xiàn)方式,推薦使用。調(diào)用的時(shí)候是這樣的,session.evict(Object obj);這樣就可以了。

使用注解獲取session方法

@PersistenceContext
    private EntityManager entityManager;

然后在方式中我們使用如下方式獲取session

 HibernateEntityManager hEntityManager = (HibernateEntityManager)entityManager;
        Session session = hEntityManager.getSession();

然后使用獲取到的session根據(jù)上面說(shuō)的操作對(duì)象既可

jpa實(shí)體類(lèi)一對(duì)多set與list使用

當(dāng)從一的一端取出其所對(duì)應(yīng)的多的一端時(shí),如果用的是set那么取出多的一端的值時(shí)順序是無(wú)序的,如果用的是list那么取出多的一端的值時(shí)順序是有序的(其實(shí)就是list與set的特性罷了,然鵝。。。。。。)

問(wèn)題:因?yàn)閟et查詢(xún)出的數(shù)據(jù)是無(wú)序的,如果當(dāng)一的一端對(duì)應(yīng)5條數(shù)據(jù),而分頁(yè)的單頁(yè)只顯示3條數(shù)據(jù),當(dāng)?shù)较乱豁?yè)時(shí),其中的兩條數(shù)據(jù)可能與與上一頁(yè)的3條數(shù)據(jù)出現(xiàn)隨機(jī)相同的情況,因此會(huì)導(dǎo)致數(shù)據(jù)顯示的缺失和無(wú)序。

注:不過(guò)jpa設(shè)計(jì)的時(shí)候用的是set不是沒(méi)有道理的,主要是利用set的數(shù)據(jù)不可重復(fù)性,用于避免數(shù)據(jù)的重復(fù),比如新增數(shù)據(jù)的時(shí)候避免數(shù)據(jù)的重復(fù)插入。

完美的解決辦法:

在實(shí)體類(lèi)set屬性上加上@orderBy("id asc")屬性進(jìn)行排序,然后在取值的時(shí)候使用LinkedHashSet(不可重復(fù)且有序sss)接住即可

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

远安县| 宁安市| 峨边| 新营市| 莒南县| 临海市| 襄垣县| 汝阳县| 武义县| 洛扎县| 林西县| 珲春市| 兴城市| 新兴县| 沧州市| 同德县| 盐边县| 合阳县| 石棉县| 涿州市| 息烽县| 贵南县| 晋州市| 辽宁省| 岗巴县| 长垣县| 永新县| 武平县| 绥芬河市| 项城市| 临沭县| 鸡西市| 镇巴县| 肥东县| 泰州市| 奈曼旗| 旬阳县| 黄骅市| 竹溪县| 石嘴山市| 南安市|