我有一個令人困惑的問題,我還沒有想出如何解決。如果您可以提供我如何解決我的問題的建議,我將不勝感激。刪除@ManyToMany關聯期間出現休眠異常
所以我有以下實體關係模型here。
User.class的映射爲:
@Entity
@Table(name = "CRM_USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USER_ID")
private Long id;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "BIRTHDATE")
private Date birthDate;
@Column(name = "EMAIL")
private String email;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private UserAdditionalInfo additionalInfo;
@ManyToOne
@JoinColumn(name = "TEAM_FK")
private Team team;
@ManyToOne
@JoinColumn(name = "JOB_FK")
private Job job;
@ManyToOne
@JoinColumn(name = "ORGANIZATION_FK", nullable = false)
private Organization organization;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private Security security;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "INFO_FILE_FK")
private InfoFile profilePicture;
@ManyToOne
@JoinColumn(name = "COUNTRY_FK")
private Country country;
// Getters and Setters
}
Comment.class的映射爲:
@Entity
@Table(name = "CRM_COMMENT")
public class Comment implements Serializable {
private static final long serialVersionUID = -104145851368148154L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "COMMENT_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "ARTICLE_ID")
private Article article;
@ManyToOne
@JoinColumn(name = "USER_FK", nullable = false)
private User createdUser;
@Column(nullable = false)
private String comment;
@Column(name = "CREATION_DATE", nullable = false)
private Date creationDate;
@Column(name = "MODIFICATION_DATE")
private Date modificationDate;
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval = true)
@JoinTable(name = "CRM_COMMENT_LIKE",
joinColumns = {@JoinColumn(name = "COMMENT_ID")},
inverseJoinColumns = {@JoinColumn(name = "USER_ID")})
private Set<User> fans = new LinkedHashSet<>();
// Getters and Setters
}
Article.class的映射是:
@Entity
@Table(name = "CRM_ARTICLE")
public class Article implements Serializable {
// other properties
@OneToMany(mappedBy = "article", cascade = {CascadeType.ALL}, orphanRemoval = true)
@OrderBy("id DESC")
private Set<Comment> comments = new LinkedHashSet<>();
// Getters and Setters
}
該問題與Comment和User - CRM_COMMENT_LIKE之間的ManyToMany關係有關。
實際上,當我在評論中添加一些新的'粉絲'時,沒有任何問題。
@Override
public boolean giveAnLikeToComment(Long commentId, User fan) {
Comment comment = commentDao.get(commentId);
if (Objects.isNull(comment)|| BooleanUtils.isTrue(comment.getFans().contains(fan))) {
return false;
}
comment.getFans().add(fan);
commentDao.update(comment);
return true;
}
的問題出現了,當我嘗試刪除一些評論,其中有至少一個「像」 /「風扇」它。
@Override
public boolean deleteCommentById(final Long commentId) {
Comment comment = commentDao.get(commentId);
if (Objects.nonNull(comment)) {
Article article = comment.getArticle();
article.getComments().remove(comment);
comment.setFans(null); // This line fix the problem
articleDao.update(article);
return true;
}
return false;
}
所以在這種情況下,我管理文章(它是評論的父母)和評論本身之間的關係。這很容易,因爲它們之間的連接是雙向的。但是粉絲呢?我無法刪除Comment和CRM_COMMENT_LIKE關係之間的連接,因爲用戶不知道CRM_COMMENT_LIKE或有關評論。當我刪除一條評論,刪除CRM_COMMENT_LIKE中的所有創建的關係時,我想要的更多。但我阻止,因爲Hibernate拋出一個異常,說:
刪除的對象將通過級聯(移除協會刪除的對象)重新保存: [crm.alltogether.core.admin.model。用戶#1];嵌套的異常是 org.hibernate.ObjectDeletedException:由級聯刪除對象將被重新保存 (刪除從刪除的關聯對象): [crm.alltogether.core.admin.model.User#1]
這是我的問題,所以如果你有一個建議,我將很樂意閱讀:)
最好的問候,
你好,非常感謝你的建議,但是錯誤依然存在 – Streetsouls 2014-09-12 19:59:51
哦,這個例外很明顯,我們需要刪除'User'上的關聯。你可以嘗試設置'comment.setFans(null)'或者先刪除所有'fans',然後刪除它們的註釋。 – 2014-09-12 21:35:36
你好,非常感謝。在deleteCommentById()內部發生這種變化後,所有工作都完美無缺。 Hibernate生成: 'Hibernate:從CRM_COMMENT_LIKE中刪除,其中COMMENT_ID =? 休眠:從CRM_COMMENT刪除其中COMMENT_ID =?' 最好的問候:) – Streetsouls 2014-09-12 21:45:50