JPA修改外來鍵關聯的實體類

2021-08-19 04:55:13 字數 1637 閱讀 8878

情況一: 不update外來鍵id, update外來鍵關聯的實體物件(不允許設定外來鍵實體關聯物件的id)

restaurantdto restaurantdto = restaurantdao.getbyuserid(userid);

restaurantdto.getlocation().setname(restaurant.getname());

restaurantdto.getlocation().setconnperson(restaurant.getprincipal());

restaurantdto.getlocation().setpointx(restaurant.getlocation().getpointx());

restaurantdto.getlocation().setpointy(restaurant.getlocation().getpointy());

restaurantdto.setname(restaurant.getname());

restaurantdto.setprincipal(restaurant.getprincipal());

restaurantdao.returnentitymanager().merge(restaurantdto);

情況二: update外來鍵id, 需要例項化乙個新的外來鍵關聯物件, 原有外來鍵關聯的物件絕不允許修改, 如果修改了必須把下面的注釋乾掉

restaurantdto restaurantdto = restaurantdao.getbyuserid(userid);  

locationdto location = new locationdto(restaurant.getlocation());

location.setconnperson(restaurantdto.getprincipal());

location.setconnphone(userdto.getphone());

如果原外來鍵關聯的實體修改,必須使用clear後才能儲存新new的實體

locationdao.returnentitymanager().persist(location);

//location = locationdao.returnentitymanager().merge(location); 如果使用merge替換persist, 必須對location重新賦值

restaurantdto.setlocation(location);

restaurantdao.returnentitymanager().merge(restaurantdto);

1. hql查詢得到的資料封裝到物件中,物件會放入一級快取嘛(再次查詢不會使用快取,但是修改會儲存到db)

2. 通過關聯查詢時(如a外來鍵關聯b), a和b都放入到一級快取中, 只要a和b中的任一字段修改, 都會在事務提交時做update操作.

(1)jpa不允許一級快取中的物件的主鍵id被修改

(2)級聯儲存時, 可以設定a和b的關聯關係, 直接儲存a即可. 而在對a的外來鍵關聯的b做實體級別的替換時(即先查出a,然後修改

a的外來鍵), 必須先new 乙個新的b實體, 並對b持久化(或者說將b實體由瞬態變為託管態)

3. persist()和merge的區別: 

JPA實體類中的常用註解

entity entity標記在類名上面,作為實體類的標識 table 當實體類與其對映的資料庫表名不同名時需要使用 table 標註說明,該標註與 entity 標註並列使用,置於實體類宣告語句之前,可寫於單獨語句行,也可與宣告語句同行。table 標註的常用選項是 name,用於指明資料庫的表名...

C 實體類的關聯運用

定義學生類 student class student public string stu name public int stu age public string stu pwd public classes cls public stu cj cj 定義班級類classes class cla...

JPA單項一對多外來鍵關聯

一對多即乙個物件中包含又另外乙個物件的集合。user主表 table name user entity public class user public void setlistorder listlistorder id tablegenerator name pk primary table o...