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

jpa使用uuid策略后無法手動設置id的問題及解決

 更新時間:2024年08月12日 09:12:09   作者:流年ln  
這篇文章主要介紹了jpa使用uuid策略后無法手動設置id的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

jpa使用uuid策略后無法手動設置id

實體對象定義如下:

@Data
@Entity
@Table(name = "sys_user")
public class UserDO {

	/** 用戶id */
	@Id
	@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
	@GeneratedValue(generator = "uuid")
	@Column(length = 36, nullable = false)
	private String userId;
	....
}

調用jpa的save方法,即使手動設置了id,手動設置的這個id也會被覆蓋。

要求

當用戶手動設置了id,以用戶設置的id為準,否則使用uuid

解決方案

使用自定義id生成策略,判斷id非空

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.UUIDGenerator;

import javax.persistence.Id;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 自定義uuid生成策略, 擴展 {@link org.hibernate.id.UUIDGenerator}
 * 當用戶設置了id,以用戶設置的id為主,為空則生成uuid
 * {@link javax.persistence.Id} 注解的字段只處理第一個
 *
 * @author qiudw
 * @date 7/7/2023
 */
@Slf4j
public class CustomerUuidGenerator extends UUIDGenerator {

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object obj) {
		Class<?> clazz = obj.getClass();
		log.debug("generate id class: {}", clazz.getName());
		Field[] fields = clazz.getDeclaredFields();
		try {
			for (Field field : fields) {
				Id idAnnotation = field.getAnnotation(Id.class);
				if (idAnnotation == null) {
					continue;
				}
				String fieldName = field.getName();
				log.debug("field name: {}", fieldName);
				String getMethodName = generateGetMethodName(fieldName);
				log.debug("get method name: {}", getMethodName);
				Method declaredMethod = clazz.getDeclaredMethod(getMethodName);
				String idValue = (String) declaredMethod.invoke(obj);
				if (StrUtil.isNotBlank(idValue)) {
					log.debug("use set value: {}", idValue);
					return idValue;
				}
			}
		} catch (NoSuchMethodException e) {
			log.error("no such method", e);
		} catch (InvocationTargetException | IllegalAccessException e) {
			log.error("invoke exception", e);
		}

		return super.generate(session, obj);
	}

	/**
	 * 生成get和set的方法名稱
	 * type + 首字母大寫(fieldName)
	 *
	 * @param fieldName userId
	 * @return type = set, fieldName = userId, 返回 setUserId
	 */
	private String generateGetMethodName(String fieldName) {
		return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	}

}

實體對象使用自定的策略

@Data
@Entity
@Table(name = "sys_user")
public class UserDO {

	/** 用戶id */
	@Id
	@GenericGenerator(name = "uuid", strategy = "com.user.CustomerUuidGenerator")
	@GeneratedValue(generator = "uuid")
	@Column(length = 36, nullable = false)
	private String userId;
	....
}

現(xiàn)在可以手動設置id了

不設置則自動生成uuid

總結

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

相關文章

  • java中mybatis和hibernate的用法總結

    java中mybatis和hibernate的用法總結

    在本篇文章里小編給大家整理的是一篇關于java中mybatis和hibernate的用法總結內容,有興趣的朋友們可以學習參考下。
    2021-01-01
  • JpaRepository如何實現(xiàn)增刪改查并進行單元測試

    JpaRepository如何實現(xiàn)增刪改查并進行單元測試

    這篇文章主要介紹了JpaRepository如何實現(xiàn)增刪改查并進行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java 解析線程的幾種狀態(tài)詳解

    Java 解析線程的幾種狀態(tài)詳解

    這篇文章主要為大家詳細介紹了Java 解析線程的幾種狀態(tài),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java8新特性之重復注解(repeating annotations)淺析

    Java8新特性之重復注解(repeating annotations)淺析

    這篇文章主要介紹了Java8新特性之重復注解(repeating annotations)淺析,這個新特性只是修改了程序的可讀性,是比較小的一個改動,需要的朋友可以參考下
    2014-06-06
  • SpringBoot項目Jar包使用systemctl運行過程

    SpringBoot項目Jar包使用systemctl運行過程

    這篇文章主要介紹了SpringBoot項目Jar包使用systemctl運行過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java構造器與傳值學習總結

    Java構造器與傳值學習總結

    這篇文章主要為大家詳細介紹了Java構造器與傳值學習總結,文中示例介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java初學者必會的Map集合及其原理

    Java初學者必會的Map集合及其原理

    這篇文章主要給大家介紹Map集合及其原理,該集合中的信息是key-value形式,Map集合與Collection集合又有什么不同呢,要想搞清楚以上問題,下面跟著小編一起來看看吧
    2023-06-06
  • Spring Security 使用 OncePerRequestFilter 過濾器校驗登錄過期、請求日志等操作

    Spring Security 使用 OncePerRequestFilter 

    OncePerRequestFilter是一個過濾器,每個請求都會執(zhí)行一次;一般開發(fā)中主要是做檢查是否已登錄、Token是否過期和授權等操作,而每個操作都是一個過濾器,下面介紹Spring Security 使用 OncePerRequestFilter 過濾器校驗登錄過期、請求日志等操作方法,感興趣的朋友一起看看吧
    2024-06-06
  • Spring MVC 圖片的上傳和下載功能

    Spring MVC 圖片的上傳和下載功能

    SSM 框架是一種基于Java的Web開發(fā)框架,其中Spring作為控制層、SpringMVC作為視圖層、MyBatis作為持久層,這個框架非常適合Web應用程序的開發(fā),這篇文章主要介紹了Spring MVC 圖片的上傳和下載功能,需要的朋友可以參考下
    2023-03-03
  • idea 安裝 Mybatis 開發(fā)幫助插件 MyBatisCodeHelper-Pro 插件破解版的方法

    idea 安裝 Mybatis 開發(fā)幫助插件 MyBatisCodeHelper-Pro 插件破解版的方法

    MyBatisCodeHelper-Pro 插件可以幫助我們快速的開發(fā) mybatis,這篇文章給大家介紹idea 安裝 Mybatis 開發(fā)幫助插件 MyBatisCodeHelper-Pro 插件破解版的相關知識,感興趣的朋友跟隨小編一起看看吧
    2020-09-09

最新評論

北海市| 镇沅| 收藏| 安阳市| 高陵县| 清水河县| 梁平县| 安岳县| 商城县| 桓台县| 忻城县| 宝丰县| 大丰市| 彰化县| 疏勒县| 云安县| 东丰县| 桑日县| 嘉祥县| 明光市| 陵川县| 铜梁县| 桦甸市| 甘洛县| 沧州市| 隆昌县| 兴和县| 喜德县| 文水县| 雷波县| 侯马市| 望江县| 开江县| 南和县| 石城县| 勐海县| 内丘县| 通州市| 大埔县| 鞍山市| 吉安市|