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

jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑

 更新時(shí)間:2021年12月06日 09:31:29   作者:Jimi1985  
這篇文章主要介紹了jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

jpa onetomany 使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑

一、異常產(chǎn)生的場(chǎng)景

兩個(gè)實(shí)體類,為一對(duì)多的關(guān)系

主表 ,字段維護(hù)表,1個(gè)用戶可能有多個(gè)角色

實(shí)體類User,代碼如下:

package ywcai.ls.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
@Entity
@Table(name="user")
public class User implements Serializable{
/**
* 
*/
private static final long serialVersionUID = -7383132326629943397L;
@Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name="id")
    private Long id;
    @Column(name="username")
    private String username;
    @Column(name="password")
    private String password;
    @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER,mappedBy="user")
   //特別注意:onetomany標(biāo)識(shí)這是級(jí)聯(lián)1對(duì)多的關(guān)系。cascade={CascadeType.ALL}表示主表的增查刪改都會(huì)直接通過關(guān)聯(lián)字段對(duì)從表進(jìn)行相應(yīng)操作。
   //例如刪除主表的一個(gè)user實(shí)例,從表與user相關(guān)聯(lián)roles將被刪除。
   //而fetch=FetchType.EAGER表示急加載,即指一旦主表進(jìn)行了相應(yīng)操作,則從表也將立即進(jìn)行相應(yīng)的級(jí)聯(lián)操作。
   //例如,一旦讀取了user表的某一個(gè)實(shí)例,則user會(huì)立即加載Roles;而fetch=FetchType.LAZY為懶加載,當(dāng)需要使用到getRolelist()方法時(shí),才會(huì)讀取相關(guān)聯(lián)的級(jí)聯(lián)表數(shù)據(jù)
    @OrderBy(value= "id ASC")//獲取的角色信息根據(jù)角色表的id進(jìn)行升序排序
    private Set<Roles> rolelist;
    
public Set<Roles> getRolelist() {
return rolelist;
}
public void setRolelist(Set<Roles> rolelist) {
this.rolelist = rolelist;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}

被維護(hù)的級(jí)聯(lián)表,多個(gè)Roles角色可能對(duì)應(yīng)1個(gè)用戶

實(shí)體類Roles,代碼如下:

package ywcai.ls.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="roles")
public class Roles {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name="id")
    private Long id;
    @Column(name="username")
    private String username;
    @Column(name="rolename")
    private String rolename;
    @ManyToOne(cascade={CascadeType.REFRESH},fetch=FetchType.LAZY)
    @JoinColumn(name="userid")//加入一列作為外鍵
    private User user;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}

二、存在異常的問題

當(dāng)Roles類級(jí)聯(lián)操作屬性使用(cascade={CascadeType.REFRESH},這樣主要為達(dá)到對(duì)從表的某一個(gè)用戶的權(quán)限進(jìn)行操作,而不影響主表User。

這時(shí)候Roles的注解

@ManyToOne(cascade={CascadeType.REFRESH},fetch=FetchType.EAGER)

通過user對(duì)Roles進(jìn)行增加操作時(shí),無任何問題。但單獨(dú)對(duì)Roles表中的一項(xiàng)進(jìn)行刪除,例如單獨(dú)刪除A用戶的管理員橘色,則無法刪除。

@Repository
@Table(name="roles")
@Qualifier("rolesRepository")
public interface RolesRepository extends JpaRepository<Roles, Long > {
@Transactional
int deleteByUsernameAndRolename(String username,String rolename);
}

首先通過JpaRepository約束接口刪除數(shù)據(jù),必須開啟事務(wù),否則報(bào)錯(cuò)。

而開啟事務(wù)后,該刪除代碼可以執(zhí)行,執(zhí)行返回的結(jié)果也正常返回1,但實(shí)際的數(shù)據(jù)中卻沒有反應(yīng),數(shù)據(jù)無法被刪除。

三、異常原因分析

出現(xiàn)該問題的原因是Roles使用了CascadeType.REFRESH注解,Roles刪除了該表中的相應(yīng)數(shù)據(jù)后,會(huì)自動(dòng)試圖去刪除主表中該USER實(shí)體數(shù)據(jù)。但由于注解中僅賦予了CascadeType.REFRESH,讀取刷新數(shù)據(jù)的權(quán)限,因此刪除主表中該USER實(shí)體數(shù)據(jù)的語句是無法執(zhí)行的,最終造成了整個(gè)deleteByUsernameAndRolename()事務(wù)的失敗回滾,結(jié)果就是要?jiǎng)h的數(shù)據(jù)沒刪掉。

若在Roles實(shí)體類增加CascadeType.REMOVE權(quán)限,雖deleteByUsernameAndRolename()的事務(wù)可以正常執(zhí)行,但會(huì)造成主表USER用戶也被整體刪除,進(jìn)而反過來造成Roles表中所有該USER的角色也都被刪除。顯然,這和業(yè)務(wù)需求也不符合。

四、解決方案

上訴的問題看起來已經(jīng)是一個(gè)邏輯相悖的矛盾,無法解決。實(shí)際上只需要將Roles中加載模式改為懶加載即可,User實(shí)體類的加載模式不需改變。

當(dāng)刪除roles中記錄時(shí)不會(huì)立即觸發(fā)到對(duì)User實(shí)體類數(shù)據(jù)的刪除,也就不會(huì)報(bào)錯(cuò)和造成失誤的回滾。

jpa onetomany的用法

one部分

時(shí)機(jī)項(xiàng)目中使用到的。

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy="dcpDataServiceManage")
    private List<DcpDataServiceTableFieldEntity> dataServiceTableFieldList;

注意這個(gè)mappBy 要和many部分字段對(duì)應(yīng)上

many部分

/**
     * 關(guān)聯(lián)的
     */
    @ManyToOne
    @JoinColumn(referencedColumnName = "gid")
    private DcpDataServiceManageEntity dcpDataServiceManage;

這塊注意的是數(shù)據(jù)庫保存的是實(shí)體類的gid.。one部分mappBy就是這個(gè)字段名。

注意

這塊就可以省去中間的一張關(guān)聯(lián)表。由于項(xiàng)目的原因。不能采用jpa 自動(dòng)建表的功能。這里使用的是sql。 特別注意的是這個(gè)字段名在數(shù)據(jù)庫創(chuàng)建的時(shí)候要加GID的

在這里插入圖片描述

像上面代碼塊的字段 根據(jù)表映射規(guī)則 數(shù)據(jù)庫存的字段應(yīng)該是DCP_DATA_SERVICE_MANAGE_GID 這個(gè)要注意一下

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

相關(guān)文章

  • 淺談一下Java中的堆和棧

    淺談一下Java中的堆和棧

    這篇文章主要介紹了一下Java中的堆和棧,Java數(shù)據(jù)類型在執(zhí)行過程中存儲(chǔ)在兩種不同形式的內(nèi)存中:棧和堆,它們通常由運(yùn)行Java虛擬機(jī)(JVM)的底層平臺(tái)維護(hù),需要的朋友可以參考下
    2023-04-04
  • 解決SpringBoot中的Scheduled單線程執(zhí)行問題

    解決SpringBoot中的Scheduled單線程執(zhí)行問題

    在一次SpringBoot中使用Scheduled定時(shí)任務(wù)時(shí),發(fā)現(xiàn)某一個(gè)任務(wù)出現(xiàn)執(zhí)行占用大量資源,會(huì)導(dǎo)致其他任務(wù)也執(zhí)行失敗,這篇文章主要介紹了SpringBoot中的Scheduled單線程執(zhí)行問題及解決方法,需要的朋友可以參考下
    2022-06-06
  • Java?精煉解讀類和對(duì)象原理

    Java?精煉解讀類和對(duì)象原理

    面向?qū)ο竽耸荍ava語言的核心,是程序設(shè)計(jì)的思想。Java語言的面向?qū)ο蠹夹g(shù)包括了面向?qū)ο蠛兔嫦蜻^程的基本概念,面向?qū)ο蟮奶卣鳎琂ava語言的類,對(duì)象,修飾符,抽象類等一系列的知識(shí)點(diǎn)
    2022-03-03
  • Spring Boot加密配置文件方法介紹

    Spring Boot加密配置文件方法介紹

    這篇文章主要介紹了SpringBoot加密配置文件,近期在對(duì)開發(fā)框架安全策略方面進(jìn)行升級(jí)優(yōu)化,提供一些通用場(chǎng)景的解決方案,本文針對(duì)配置文件加密進(jìn)行簡單的分享
    2023-01-01
  • SpringBoot自動(dòng)裝配原理詳解

    SpringBoot自動(dòng)裝配原理詳解

    這篇文章主要詳細(xì)介紹了SpringBoot的自動(dòng)裝配原理,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考一下
    2023-04-04
  • Java語言的安裝、配置、編譯與運(yùn)行過程

    Java語言的安裝、配置、編譯與運(yùn)行過程

    本文詳細(xì)介紹了如何在Windows、macOS和Linux操作系統(tǒng)上安裝、配置Java開發(fā)環(huán)境(JDK),并展示了如何編寫、編譯和運(yùn)行Java程序,同時(shí),還提供了常見問題的解決方案,正確配置Java環(huán)境對(duì)Java開發(fā)至關(guān)重要,是進(jìn)行Java編程的基礎(chǔ)
    2025-02-02
  • 解決Spring中@Value注解取值為null問題

    解決Spring中@Value注解取值為null問題

    近期應(yīng)用中因業(yè)務(wù)迭代需要接入 user 客戶端,接入后總是啟動(dòng)失敗,報(bào)注冊(cè) user bean 依賴的配置屬性為 null,所以接下來小編就和大家一起排查分析這個(gè)問題,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • java基礎(chǔ)之NIO介紹及使用

    java基礎(chǔ)之NIO介紹及使用

    這篇文章主要介紹了java基礎(chǔ)之NIO介紹及使用,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java多線程實(shí)現(xiàn)下載圖片并壓縮

    java多線程實(shí)現(xiàn)下載圖片并壓縮

    這篇文章主要為大家詳細(xì)介紹了java多線程實(shí)現(xiàn)下載圖片并壓縮,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java基于MySQL實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    Java基于MySQL實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java基于MySQL實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

苏尼特左旗| 婺源县| 浙江省| 黄大仙区| 清涧县| 吴忠市| 饶河县| 钦州市| 陕西省| 淳安县| 阳谷县| 桑日县| 乳山市| 青州市| 阿荣旗| 海晏县| 临清市| 华阴市| 汶川县| 南陵县| 安平县| 仙居县| 道孚县| 客服| 霍邱县| 乡城县| 黑山县| 绥阳县| 达拉特旗| 永善县| 乡城县| 塘沽区| 安徽省| 孝感市| 阜康市| 肥西县| 什邡市| 福贡县| 天镇县| 淳安县| 龙泉市|