2014-09-12 72 views
1

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

这是我的问题,所以如果你有一个建议,我将很乐意阅读:)

最好的问候,

回答

0

你需要有ArticleComment之间的orphanRemoval=true级联。那么你会这样做。

if (Objects.nonNull(comment)) { 
     Article a = comment.getArticle(); 
     a.getComments().remove(comment); 
     articleDao.saveOrUpdate(a); 
     return true; 
} 

这会照顾孤儿删除评论的,因为你已经有了一个梯级上的所有fans它会删除该关联也是如此。我建议你也可以在fans上玩游戏orphanRemoval=true

+0

你好,非常感谢你的建议,但是错误依然存在 – Streetsouls 2014-09-12 19:59:51

+0

哦,这个例外很明显,我们需要删除'User'上的关联。你可以尝试设置'comment.setFans(null)'或者先删除所有'fans',然后删除它们的注释。 – 2014-09-12 21:35:36

+0

你好,非常感谢。在deleteCommentById()内部发生这种变化后,所有工作都完美无缺。 Hibernate生成: 'Hibernate:从CRM_COMMENT_LIKE中删除,其中COMMENT_ID =? 休眠:从CRM_COMMENT删除其中COMMENT_ID =?' 最好的问候:) – Streetsouls 2014-09-12 21:45:50