簡體   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