我会简单地说。我有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值。
或者,让我知道我是否对这个问题有误解。