【发布时间】:2017-09-07 17:44:38
【问题描述】:
使用 Hibernate 5、Spring 4
请考虑以下代码和两个实体之间的映射:
用户类
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
private TruckOwner truckOwner;
//下面的getter setter
TruckOwner 类
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
//getter setter 下面
当我的代码尝试更新 user 类中的值时,如下代码:
UserServiceImpl 类
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void resetPassword(Long userId,String newPassword) {
User user = userDAO.findById(userId);
user.setPassword(newPassword);
System.out.println(user.getTruckOwner().getTruckOwnerId());
userDAO.merge(user);
}
调用userDAO.merge(user); 时出现以下错误:
非瞬态实体的 id 为空:com.mymodel.TruckOwner
我在项目的很多地方都面临这种问题,请帮助我解决这个问题,为什么 TruckOwner 类的所有内容都被休眠设置为空?
【问题讨论】:
-
尝试打印用户ID
-
试过了。它打印预期的...用户对象没有问题。
-
你使用什么 id 生成策略?
-
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)这个 -
那是完全无效的答案。您不能通过调用
userDAO.merge来保存/合并truckOwner对象,userDAO 和 truckOwnerDAO 是分开的。用户和卡车实体完全不同,仅通过映射连接。
标签: java spring hibernate mapping one-to-one