2014-09-12 106 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