我会简单地说。我有User类和Privilege类。用户有许多特权。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
private Set<Privilege> privileges;


特权只有一个用户。

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;


如您所见,我已将CascadeType指定为ALL,但是每当要保留User时:

    Set<Privilege> privs = new HashSet<>();
    Privilege priv = new Privilege("anything");
    //priv.setUser(user); it works with this line, of course
    privs.add(priv);
    user.setPrivileges(privs);
    //session.save(user);


特权尚未绑定用户。
有任何想法吗?

@Entity
@Table(name = "users")

public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;

@Column(name="email", nullable = false, unique = true)
private String email;

@Column(name="password")
private String password;

@Column(name="user_type")
@Enumerated(EnumType.STRING)
private UserType userType;

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "user")
private Set<Privilege> privileges = new HashSet<>();


// getters,setters

@Entity
@Table(name = "privileges", uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "privilege"}))
public class Privilege {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "privilege")
private String privilege;

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;


// getters setters

最佳答案

为确保得到您的声明“特权尚未绑定用户”。如果您取消注释priv.setUser(user),则休眠状态可以将用户与数据库中的特权相关联(即,在特权表中正确填充了user_id字段)。而且,如果您注释掉这一行,则不会在特权表中看到与user_id相关联的信息。那正确吗?

如果是这样,原因是您在oneToMany批注中指定了mappedBy=user。这将通知休眠状态,该关联是由“特权”中的“用户”字段管理的。因此,当hibernate插入特权记录时,它将查找用户字段以填充userID。

使用priv.setUser(user)时,hibernate现在将知道该特权必须与哪个用户相关联,如果您未设置此特权,它将为null,并且对user_id列将看到null值。

或者,让我知道我是否对这个问题有误解。

10-05 19:18