我有以下一对多的关系:
@Entity
class User {
@Id
@Column(name = "id_user", nullable = false)
private Integer idUser
// Other attribute
}
@Entity
class Car {
@Id
@Column(name = "id_car", nullable = false)
private Integer idCar
@Column(name = "id_user", nullable = false)
private Integer idUser
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_user", referencedColumnName = "id_user", nullable = false, insertable = false, updatable = false)
private User user
// Other attributes
}
创建car
并设置idUser
时如下:
Car car = new Car();
car.setIdUser(idUser);
entityManager.persist(car);
我希望car.getUser()
使用提供的ID延迟加载用户,但它是null
。如何初始化此新实体的延迟行为?我不想做car.setUser(someUser)
,因为这意味着我必须自己检索用户。
答案 0 :(得分:0)
您可以创建新用户并设置用户的ID并将其添加到汽车
User user = new User();
user.setId(userId);//userId is the id of user in db
car.setUser(user)
答案 1 :(得分:0)
当hibernate无法初始化代理时,会抛出LazyInitializationException
。当您获得null
时,用户很可能根本不会保留。
您正在使用的car.setIdUser(idUser);
设置器似乎是设置ID而不是实体,这很可能不是您想要做的。
你应该做某事。与car.setUser(userEntity)
类似,并完全删除外键的映射:
@Column(name = "id_user", nullable = false)
private Integer idUser;
如果您在坚持User
之前没有坚持Car
实体,那么您应该查看CascadeType.PERSIST
注意添加CascadeType.ALL
会删除如果汽车被删除,则为User
。
https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/