我有一个令人困惑的问题,我还没有想出如何解决。如果您可以提供我如何解决我的问题的建议,我将不胜感激。删除@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