gpt4 book ai didi

java - Hibernate OneToOne 映射实体将所有属性设置为 null

转载 作者:IT老高 更新时间:2023-10-28 13:46:33 25 4
gpt4 key购买 nike

使用 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); 我得到以下错误:非 transient 实体的 id 为空:com.mymodel.TruckOwner

我在项目的很多地方都面临这种问题,请帮助我解决这个问题,为什么 TruckOwner 类的所有内容都被 hibernate 设置为空?

最佳答案

我们应该知道userdao merge方法的实现,但我猜它叫做hibernate Session接口(interface)的merge方法在任何情况下,非 transient 对象都是 TruckOwner 对象;当您调用 System.out.println(user.getTruckOwner().getTruckOwnerId()); 时, hibernate 将不会获取对象此外,此时您已退出 hibernate session ,并且如果您调用任何其他 getter TruckOwner 除了 getTruckOwnerId() 你应该得到 org.hibernate.LazyInitializationException (或类似的......我记错了)

我猜你有两个选择:

  1. 按照 staszko032 的建议,您应该将 fetch type 更改为 EAGER
  2. 当您使用 userDAO.findById(userId); 加载用户对象时,您应该通过调用 hibernate session 中的任何其他方法 fetch userDAO.findById(userId); 实现和 hibernate session 内部

希望有用

安杰洛

关于java - Hibernate OneToOne 映射实体将所有属性设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43361151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com