繁体   English   中英

使用级联的Hibernate OneToMany映射

[英]Hibernate OneToMany mapping with cascade

我会简单地说。 我有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)则hibernate可以将用户与数据库中的特权相关联(即,Privilege表中的user_id字段已正确填充)。 而且,如果您注释掉这一行,则不会在特权表中看到与user_id相关联的信息。 那正确吗?

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

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

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

当您休眠保存过程将导致ACTION_SAVE_UPDATE动作,但JPA将传递ACTION_PERSIST和ACTION_MERGE时,它将不匹配并导致级联执行失败。

如果删除JPA级联– javax.persistence.CascadeType,请用Hibernate级联– org.hibernate.annotations.Cascade替换为CascadeType.SAVE_UPDATE。

它必须工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM