And*_*ver 5 java spring hibernate
我想知道通过不使用代理对象而是通过创建新对象并手动设置ID来将实体与子实体相关联是否可行?像这样?
@Transactional
public void save(@NonNull String name, @NonNull Long roleId) {
User user = new User();
user.setName(name);
Role role = new Role(); role.setRoleId(roleId);
// Instead of:
// roleRepository.getOne(roleId);
user.setRole(role);
userRepository.save(user);
}
Run Code Online (Sandbox Code Playgroud)
我知道,可以通过调用smth来实现这一公认且有据可查的方法。喜欢:
em.getReference(Role.class, roleId) ;
Run Code Online (Sandbox Code Playgroud)
或者如果使用Spring Data
roleRepository.getOne(roleId);
Run Code Online (Sandbox Code Playgroud)
或休眠方式:
session.load(Role.class, roleId)
Run Code Online (Sandbox Code Playgroud)
因此,问题是,如果他通过欺骗JPA提供程序并使用带有集合ID的新对象来实现此技巧,将会面临什么样的严重后果?请注意,执行getOne()的唯一原因是将新创建的实体与现有实体相关联。然而,角色模拟对象并未得到管理,也不用担心丢失任何数据。它只是做连接两个实体的工作。
从Hibernate文档中:
getReference()获得对该实体的引用。状态可以初始化也可以不初始化。如果该实体已经与当前正在运行的Session关联,则返回该引用(是否已加载)。如果该实体未在当前会话中加载并且该实体支持代理生成,则会生成并返回未初始化的代理,否则从数据库加载该实体并返回。
因此,在测试之后,我发现它基本上甚至没有命中数据库来检查ID的存在,并且如果违反FK约束,则save()在提交时将失败。它只需要附加依赖项即可自动关联(RoleRepository)。
那么,如果我的情况如此简单,为什么我应该通过调用getOne()而不是使用new创建的模拟对象来获取此代理?这种方法可能在什么时候出问题?
谢谢您的澄清。
编辑:
Hibernate / JPA,仅在@OneToOne关联上设置id时保存一个新实体
此相关主题无法回答问题。我在问为什么调用JPA的API getReference()更好,如果我采用这种用给定的ID和new运算符创建新的“模拟”对象的做法,对我来说会发生什么错误?
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |