2014-09-12 3 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 
} 

문제는 설명과 사용자 간의 내 ManyToMany 관계 - CRM_COMMENT_LIKE와 관련이 있습니다.
사실, '팬'을 댓글에 추가하면 문제가 없습니다. 내가/'팬'그것 '처럼'하나 이상의 을 가지고 몇 가지 코멘트를 삭제하려고하면

@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; 
    } 

이 경우, 기사 (설명의 부모)와 주석 자체 사이의 관계를 관리합니다. 둘 사이의 연결이 양방향이기 때문에 이것은 쉽습니다. 그러나 팬들은 어떻습니까? 사용자가 CRM_COMMENT_LIKE 또는 주석에 대해 알지 못하기 때문에 설명과 CRM_COMMENT_LIKE 관계 간의 연결을 제거 할 수 없습니다. CRM_COMMENT_LIKE에서 댓글을 삭제하고 삭제 된 모든 관계를 제거하고 싶습니다.

삭제 된 개체가 캐스케이드 (협회에서 삭제 된 개체를 제거)에 의해 다시 저장됩니다 : [crm.alltogether.core.admin.model Hibernate는 말한다 예외가 발생하기 때문에하지만, 예방입니다. 사용자 # 1]; 삭제 된 오브젝트 (오브젝트 연관 삭제 삭제) 다단 재 저장 될 것이다 : 중첩 예외 org.hibernate.ObjectDeletedException가 [crm.alltogether.core.admin.model.User # 1]

당신이 제안이있는 경우, 내가 :) 읽어

안부 기쁠 이렇게하면, 당신은 ArticleComment 사이 orphanRemoval=true 캐스 케이 딩이 필요

답변

0

내 문제입니다. 그렇다면 당신은 이것을 할 것입니다.

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

이미 그것뿐만 아니라 그 관계를 삭제할 것 fans의 모든 캐스케이드을 가지고이, 고아 코멘트를 삭제 처리됩니다. 캐스케이드 orphanRemoval=true으로 fans에 놀아 볼 것을 권합니다.

+0

안녕하십니까. 의견을 보내 주셔서 감사합니다. 그러나 오류가 여전히 존재합니다. – Streetsouls

+0

예외적으로 분명히 말하지만, '사용자'에 대한 연결을 제거해야합니다. 'comment.setFans (null)'을 설정하거나 모든'fans'를 먼저 삭제 한 다음 주석을 삭제할 수 있습니다. –

+0

안녕하세요. 대단히 감사합니다. 'deleteCommentById()'내부에서이 변경 후에, 모든 것이 완벽하게 작동합니다. Hibernate는 다음을 생성한다 : 'Hibernate : CRM_COMMENT_LIKE에서 삭제 어디서 COMMENT_ID =? 최대 절전 모드 : CRM_COMMENT에서 삭제 COMMENT_ID =? ' 안부 인사 : – Streetsouls