JPA:getReference()与仅具有ID的新“模拟”对象?

时间:2018-07-20 10:24:41

标签: 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);
    }

我知道,可以通过调用smth来接受并记录良好的方法。喜欢:

em.getReference(Role.class, roleId) ;

或者如果使用Spring Data

roleRepository.getOne(roleId);

或休眠方式:

session.load(Role.class, roleId)

所以问题是,如果他通过欺骗JPA提供程序并使用带有ID的新对象来完成此技巧,将会面临什么样的严重后果?请注意,执行getOne()的唯一原因是将新创建的实体与现有实体相关联。然而,角色模拟对象并未得到管理,也不用担心丢失任何数据。它只是做连接两个实体的工作。

从Hibernate文档中:

  

getReference()获得对该实体的引用。国家可能或可能   尚未初始化。如果实体已经与   当前正在运行的会话,将返回该引用(已加载或未加载)。   如果没有在当前会话中加载该实体,则该实体   支持代理生成,生成未初始化的代理,   返回,否则从数据库中加载实体,并且   返回。

因此,在测试之后,我发现它基本上甚至没有命中数据库来检查ID的存在,并且如果违反FK约束,则save()在提交时将失败。它只需要附加依赖项即可自动关联(RoleRepository)。

如果我的情况如此简单,为什么我应该通过调用getOne()而不是使用new创建的模拟对象来获取此代理?这种方法可能在什么时候出问题?

谢谢您的澄清。

编辑:

Hibernate/JPA, save a new entity while only setting id on @OneToOne association

此相关主题无法回答问题。我在问为什么调用JPA的API getReference()更好,如果我采用这种方法来创建新的“模拟”对象,该对象具有给定ID的 new 运算符,那会发生什么错误?

0 个答案:

没有答案