在 Hibernate 中插入/更新一个实体与另一个引用的实体

问题描述 投票:0回答:2

当在hibernate中插入/更新实体并且只想更新对更新实体的更改时,是否可以只设置保存引用实体的外键ID?例如。

UserRole userRole = new UserRole();
userRole.setId(1);
User user = new User();
user.setUserRole(userRole);

userDao.update(user);
-OR-
userDao.insert(user);

或者我是否需要每次都从数据库获取完整引用的实体?例如。

UserRole userRole = userRoleDao.getById(1);
User user = new User();
user.setUserRole(userRole);

userDao.update(user);
-OR-
userDao.insert(user);

两者似乎都适合我。但我担心第二种方法会对性能产生影响,而第一种方法看起来像是糟糕的代码。

java hibernate
2个回答
4
投票

如果

id
UserRole
的主键,则两者都是正确的。

  • 我更喜欢第一种方法。

当实体先前已被持久化时,您只需要主键来引用已创建的实体。这种情况也会发生在数据库中,如果你查看 User 表,你不会找到完整的 UserRole,你只会找到主键。


但恐怕第二种方法会对性能产生影响

一切都取决于数据库所在的位置,如果您不进行数百万次此操作,对性能的影响可以忽略不计,但如果远程数据库和连接不良,时间可能会增加。


0
投票

最佳做法是使用

EntityManage.getReference() / JpaRepository.getReferenceById

它涉及根据持久提供程序实现真正应用于数据库(对于 Hibernate 可以由
AvailableSettings.JPA_PROXY_COMPLIANCE
管理,默认情况下
false
- 不适用)

另请参阅 JPA 设置引用的属性而不检索它。最佳实践 - 使用级联优先应用程序不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.