2012-01-07 4 views
1

removeTask 메서드를 통해 TaskList에서 Task을 제거하려고하면 다음 엔티티가 있는데 예외가 발생합니다.정렬 된 최대 절전 모드 목록과의 고유 한 제약 조건 위반

@Entity 
public class TaskList extends GenericModel { 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @OrderColumn(name="position", nullable=false) 
    public List<Task> tasks = new ArrayList<>(); 

    // ... 

    public void removeTask(Task task) { 
    tasks.remove(task); 
    } 
} 

@Entity 
public class Task extends Model { 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="task_id") 
    private List<Reservation> reservations = new ArrayList<>(); 

    @ManyToOne 
    public TaskList taskList; 

    // ... 
} 

@Entity 
public class Reservation extends GenericModel { 

    @Id 
    private String id = Token.generate(8); 

    @ManyToOne 
    private Task task; 

    // ... 
} 

는 예외입니다 : 내가 최대 절전 모드 3.6.1와 JPA 2를 사용하고

"CONSTRAINT_INDEX_F ON PUBLIC.TASKLIST_TASK(TASKS_ID)" 
Unique index or primary key violation: "CONSTRAINT_INDEX_F ON PUBLIC.TASKLIST_TASK(TASKS_ID)"; SQL statement: 
update TaskList_Task set tasks_id=? where TaskList_id=? and position=? [23001-149] 

. 내 매핑에 문제가 있거나 최대 절전 모드 버그입니까?

UPDATE는

최대 절전 모드 문제가 될 것으로 보인다. deleteupdate 명령문이있는 것입니다.

@Entity 
public class TaskList extends GenericModel { 

    // .... 

    public void removeTask(Task task) { 
    tasks.remove(task); 
    tasks = new ArrayList<>(tasks); // only for Hibernate 
    task.taskList = null; 
    } 
} 

Hibernate - clearing a collection with all-delete-orphan and then adding to it causes ConstraintViolationException가 올바른 방향으로 내 부품 : 다음 해킹 문제 (부분적으로)를 해결했다.

그러나는 내 대안으로는 작동하지 않습니다. 다음 예외로 이어집니다. "cascade ="all-delete-orphan "을 가진 콜렉션은 소유하는 엔티티 인스턴스에 의해 더 이상 참조되지 않습니다." 따라서 문제는 실제로 해결되지 않습니다.

+0

위대한, 해킹이 나를 위해 일했습니다! 내 시나리오는 다음과 같습니다. 목록의 첫 번째 요소를 제거한 다음 목록의 끝에 요소를 추가했습니다. – rwitzel

답변

1

양방향 연관이 두 번 매핑됩니다. 한 번은 TaskList에, 한 번은 Task에 매핑됩니다. 작업 목록에서 매핑 주석은 mappedBy 속성없이

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="task") 
@OrderColumn(name="position", nullable=false) 
public List<Task> tasks = new ArrayList<>(); 

는, Hibernate는 두 개의 별도의 연결을 가지고 생각해야한다 (그리고 나는 당신이 원하는 의심)이 아니라 양방향 하나보다.

또한 양방향 연관을 수정하는 경우 연관의 양쪽을 수정해야합니다. (THER 더 mappedBy 특성없는 곳이기 때문에) 협회 소유 측 Task 때문에 그래서 removeTask 방법은 특별히 중요

public void removeTask(Task task) { 
    tasks.remove(task); 
    task.setTaskList(null); 
} 

이어야한다. 그래서 이것은 Hibernate가 연관성을 제거해야한다는 것을 알기 위해 검사하는면입니다.

+0

'mappedBy'는'@ OrderColumn'과 함께 사용할 수 없습니다. 왜냐하면 Hibernate는 그것을 나쁜 연습이라고 생각하고 대신에 join 테이블을 필요로하기 때문입니다. 참조 : http://stackoverflow.com/questions/2956171/ 제안 된대로 참조를 제거하려고했지만 문제가 해결되지 않았습니다. – deamon