当前位置: 代码网 > it编程>编程语言>Java > springboot jpa实现优雅处理isDelete的默认值

springboot jpa实现优雅处理isDelete的默认值

2024年11月26日 Java 我要评论
如果多个实体类都有isdelete字段,并且你希望在插入时为它们统一设置默认值,可以采取以下几种方法来减少代码重复:1. 使用基类(抽象类)创建一个基类,其中包含isdelete字段和@prepers

如果多个实体类都有 isdelete 字段,并且你希望在插入时为它们统一设置默认值,可以采取以下几种方法来减少代码重复:

1. 使用基类(抽象类)

创建一个基类,其中包含 isdelete 字段和 @prepersist 方法。然后让所有需要这个字段的实体类继承这个基类。

示例代码:

import javax.persistence.mappedsuperclass;
import javax.persistence.prepersist;

@mappedsuperclass
public abstract class baseentity {

    protected integer isdelete;

    @prepersist
    public void prepersist() {
        if (isdelete == null) {
            isdelete = 0; // 设置默认值为0
        }
    }

    // getter 和 setter
    public integer getisdelete() {
        return isdelete;
    }

    public void setisdelete(integer isdelete) {
        this.isdelete = isdelete;
    }
}

然后在其他实体类中继承 baseentity

import javax.persistence.entity;
import javax.persistence.id;

@entity
public class myentity extends baseentity {

    @id
    private long id;

    // 其他字段、getter 和 setter
}

2. 使用 aop(面向切面编程)

通过 spring aop 创建一个切面,在插入操作时检查并设置 isdelete 的默认值。这种方式不需要修改每个实体类,适合大规模应用。

示例代码:

import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.before;
import org.springframework.stereotype.component;

import javax.persistence.entitymanager;
import javax.persistence.persistencecontext;
import java.lang.reflect.field;

@aspect
@component
public class defaultvalueaspect {

    @persistencecontext
    private entitymanager entitymanager;

    @before("execution(* com.example.repository.*.save(..))") // 根据你的仓库路径调整
    public void setdefaultvalues(object entity) throws illegalaccessexception {
        field[] fields = entity.getclass().getdeclaredfields();
        for (field field : fields) {
            if ("isdelete".equals(field.getname())) { // 检查字段名
                field.setaccessible(true);
                if (field.get(entity) == null) {
                    field.set(entity, 0); // 设置默认值为0
                }
            }
        }
    }
}

3. 使用 jpa 审计功能

使用 spring data jpa 的审计功能,通过实现 auditoraware 接口来统一处理审计字段,包括 createdby,createdtime,updatedby,updatedtime等,而isdelete这种状态字段在审计注释中并没有实现。

4. 使用事件监听@entitylisteners

jpa 提供了事件监听器的功能,你可以定义一个事件监听器来处理所有需要设置默认值的实体类。

示例代码:

import javax.persistence.postload;
import javax.persistence.prepersist;
import javax.persistence.entitylisteners;

public interface deletedfield {

  	integer getdeletedflag();

	void setdeletedflag(integer deletedflag);
}

public class deletedefaultvaluelistener {

	@prepersist
	public void setdefaultvalues(deletedflagfield deletedflagfield) {
		if (deletedflagfield.getdeletedflag() == null) {
			deletedflagfield.setdeletedflag(0); // 设置默认值为0
		}
	}

}

@entitylisteners(defaultvaluelistener.class)
@entity
public class tableuseraccount extends entitybase implements deletedflagfield {

  	/**
	 * 删除标识(逻辑删除),1删除 0未删除
	 */
	@column(name = "deleted_flag")
	private integer deletedflag;
}

5. 扩展jpa,对审计字段建立者和更新者的扩展

  • createdbyfield 建立者字段接口
  • updatedbyfield 更新者字段接口
  • createdbydefaultvaluelistener 建立者字段监听器
  • updatedbydefaultvaluelistener 更新者字段监听器
  • auditorawareimpl 审计接口,返回当前用户

createdbyfield

public interface createdbyfield {

	string getcreatedby();

	void setcreatedby(string createdby);

}

扩展entitybase实体,不使用默认的createdby和lastmodifiedby

@getter
@setter
@mappedsuperclass
@entitylisteners({ auditingentitylistener.class, updatedbydefaultvaluelistener.class,
		createdbydefaultvaluelistener.class })
public abstract class entitybase implements serializable, createdbyfield, updatedbyfield {

	/**
	 * 创建人
	 */
	@column(name = "created_by")
	private string createdby;

	/**
	 * 修改人
	 */
	@column(name = "updated_by")
	private string updatedby;
	}

createdbydefaultvaluelistener

public class createdbydefaultvaluelistener implements applicationcontextaware {

	private applicationcontext applicationcontext;

	@prepersist
	public void setdefaultvalues(createdbyfield createdbyfield) {
		if (createdbyfield.getcreatedby() == null) {
			if (this.applicationcontext.getbean(auditorawareimpl.class) != null) {
				createdbyfield.setcreatedby(
						this.applicationcontext.getbean(auditorawareimpl.class).getcurrentauditor().orelse(""));

			}
		}
	}

	/**
	 * @param applicationcontext
	 * @throws beansexception
	 */
	@override
	public void setapplicationcontext(applicationcontext applicationcontext) throws beansexception {
		this.applicationcontext = applicationcontext;
	}

}

到此这篇关于springboot jpa实现优雅处理isdelete的默认值的文章就介绍到这了,更多相关springboot jpa处理isdelete默认值内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com