当在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);
两者似乎都适合我。但我担心第二种方法会对性能产生影响,而第一种方法看起来像是糟糕的代码。
如果
id
是 UserRole
的主键,则两者都是正确的。
当实体先前已被持久化时,您只需要主键来引用已创建的实体。这种情况也会发生在数据库中,如果你查看 User 表,你不会找到完整的 UserRole,你只会找到主键。
但恐怕第二种方法会对性能产生影响
一切都取决于数据库所在的位置,如果您不进行数百万次此操作,对性能的影响可以忽略不计,但如果远程数据库和连接不良,时间可能会增加。
最佳做法是使用
EntityManage.getReference() / JpaRepository.getReferenceById
。AvailableSettings.JPA_PROXY_COMPLIANCE
管理,默认情况下 false
- 不适用)
另请参阅 JPA 设置引用的属性而不检索它。最佳实践 - 使用级联优先应用程序不起作用。