2012-07-07 5 views
1

JPA에서 자체 참조 테이블에 대한 삭제를 계단식으로 만들려고 시도하지만 동일한 오류가 발생합니다. 자체 참조 테이블의 Eclipselink에서 계단식 삭제

@Entity 
@Table(name="SYS_ACL", schema="dbo") 
public class ACL implements Serializable { 
private static final long serialVersionUID = 1L; 
@EmbeddedId 
protected AccessControlListPK accessControlListPK; 

@JoinColumn(name = "ROLE_ID", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private Roletable roletable; 

@JoinColumn(name = "VIEW_ID", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private PageMap pagemap; 

@Column(name="PARENT_ROLE") 
private Long parentrole; 

@Column(name="PARENT_VIEW_ID") 
private Long parentview; 

@JoinColumns({ 
    @JoinColumn(name = "PARENT_ROLE", referencedColumnName = "ROLE_ID", nullable = true, insertable = false, updatable = false), 
    @JoinColumn(name = "PARENT_VIEW_ID", referencedColumnName = "VIEW_ID", nullable = true, insertable = false, updatable = false)}) 
@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true) 
@PrivateOwned 
private List<ACL> children = new LinkedList<ACL>(); 

내가지고있어 오류입니다 :

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: The DELETE statement conflicted with the SAME TABLE REFERENCE constraint "SYSCCSSCNTRLLSTPRNTVWD". The conflict occurred in database "mydb", table "dbo.SYS_ACL" Error Code: 547 

데이터베이스 구조는 다음과 같다 :

CREATE TABLE SYS_ACL (

VIEW_ID NUMERIC, 
ROLE_ID NUMERIC, 

PARENT_ROLE NUMERIC, 
PARENT_VIEW_ID NUMERIC, 

CONSTRAINT PK PRIMARY KEY (ROLE_ID, VIEW_ID), 
CONSTRAINT FK1 FORIEGN KEY (VIEW_ID) REFERENCING VIEW_TABLE(ID), 
CONSTRAINT FK2 FORIEGN KEY (ROLE_ID) REFERENICNG ROLE_TABLE(ID), 
CONSTRAINT FKSELF FOREIGN KEY (PARENT_ROLE, PARENT_VIEW) REFERENCING SYS_ACL(ROLE_ID, VIEW_ID)); 

내가 먼저 아이를 삭제하는 재귀 적 방법을 사용할 수 있지만 JPA에서 그렇게 할 수 있는지 알고 싶습니다. GF 3.1 및 Eclipselink 2.3.0을 사용하고 있습니다.

답변

0

SQL 로그 란 무엇입니까?

모델이 지나치게 복잡해 보입니다. AccessControlListPK를 제거하고 @ManyToOnes에 @Id를 넣을 수 있습니다.

@OneToMany에서 @JoinColumn을 사용하고 있기 때문에 문제가 발생할 수 있습니다. 일반적으로 mappedBy 및 @ManyToOne 역수를 사용합니다. 대신 외래 키에 @Basuc를 사용하는 것 같습니다.이 경우 조인을 제거하십시오. 열을 OneToMany에 추가하고 @ManyToOne을 부모에 정의하면됩니다.

+0

나는 당신이 제안한 것을 시도했지만 그것은 너무 복잡합니다. 두 필드를 사용해야하는 복합 키가 필요합니다. 그리고 각각은 다른 테이블을 참조하고 있습니다. – fareed

+0

db 테이블 구조를 추가했습니다. – fareed

+0

나열된 것과 같은 오류가 발생했습니다. – MindBrain