当通过id持久化时,Hibernate多对一属性为null

时间:2018-06-11 12:50:32

标签: java hibernate

我有以下一对多的关系:

@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),因为这意味着我必须自己检索用户。

2 个答案:

答案 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/