spring - 有没有办法在不从数据库中检索对象的情况下将对象添加到 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
?
谢谢
解决方案
为此,EntityManager 有一个 getReference() 方法。
获取参考
T getReference(Class entityClass, Object primaryKey)
获取一个实例,其状态可能会被延迟获取。如果请求的实例在数据库中不存在,则在第一次访问实例状态时抛出 EntityNotFoundException。(当调用 getReference 时,允许持久性提供程序运行时抛出 EntityNotFoundException。)应用程序不应期望实例状态在分离时可用,除非它在实体管理器打开时由应用程序访问。
参数:entityClass——实体类primaryKey——主键
返回:找到的实体实例
抛出: IllegalArgumentException - 如果第一个参数不表示实体类型,或者第二个参数不是该实体主键的有效类型或为 null EntityNotFoundException - 如果无法访问实体状态
推荐阅读
- arrays - 在交换序列后查找每个节点占用的唯一位置的数量
- elixir - 如何关闭 Elixir/Phoenix 表单中输入的自动完成功能?
- python - 从 requests.get "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 接收错误
- discord.js - Welcome message embed Discord.js
- python-3.x - 我想要一种方法来“重试”错误的用户输入。有没有办法做到这一点?
- python - win32api.ShellExecute() 函数有什么作用?
- c++ - 模板参数扣除/替换失败:
- swift - 带有错误委托方法的 Swift 协议扩展仍然有效(?!)
- sql - SQL窗口函数和连接
- django - Django 错误:找不到“登录”的反向。“登录”不是有效的视图函数或模式名称