首页 > 解决方案 > 有没有办法在不从数据库中检索对象的情况下将对象添加到 spring 的持久性上下文中?

问题描述

假设我有以下实体类:

    public class childClass {
    
    @Id
    private Long Id;
    
    @ManyToOne
    private ParentClass parentClass;

public ChildClass(ParentClass parentClass){
  this.parentClass = parentClass;
}
    
    //other fields
    }

public class ParentClass{

@Id
private Long id;

public ParentClass(Long id){
   this.id = id;
}

}

我想保留一组ChildClass基于idSet的新对象。ParentClass理想情况下,我想这样做:

parentClassSet.stream().map(parentId -> new ChildClass(new ParentClass(parentId)).collect(Collectors.toList());
childClassDao.save(parentClassSet);

但这会抛出一个错误,因为ParentClass对象不存在于持久化上下文中,因此 spring 不会将这些对象识别为有效entities的。

我必须首先根据 id 从数据库中检索 ParentClass,然后使用该对象创建一个新的 ChildClass 对象。我的问题是:如果我已经知道数据库中存在具有 id 的 ParentClass 对象,是否可以创建具有该 id 的 ParentClass 并告诉 Spring 将其视为有效entity

谢谢

标签: springhibernate

解决方案


为此,EntityManager 有一个 getReference() 方法。

获取参考

T getReference(Class entityClass, Object primaryKey)

获取一个实例,其状态可能会被延迟获取。如果请求的实例在数据库中不存在,则在第一次访问实例状态时抛出 EntityNotFoundException。(当调用 getReference 时,允许持久性提供程序运行时抛出 EntityNotFoundException。)应用程序不应期望实例状态在分离时可用,除非它在实体管理器打开时由应用程序访问。

参数:entityClass——实体类primaryKey——主键

返回:找到的实体实例

抛出: IllegalArgumentException - 如果第一个参数不表示实体类型,或者第二个参数不是该实体主键的有效类型或为 null EntityNotFoundException - 如果无法访问实体状态


推荐阅读