1

JPAで削除を自己参照テーブルにカスケードしようとしていますが、何をしても同じエラーが発生します。

@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でそれが可能かどうかを知りたいです。GF3.1とEclipselink2.3.0を使用しています

4

1 に答える 1

0

SQLログとは何ですか?

モデルが複雑すぎるようです。AccessControlListPKを削除して、@ManyToOnesに@Idを配置することをお勧めします。

@OneToManyで@JoinColumnを使用しているため、問題が発生している可能性があります。通常は、mappedByと@ManyToOneの逆を使用します。代わりに、外部キーに@Basucを使用しているようです。これらと、OneToManyの結合列を削除してください。親に@ManyToOneを定義するだけです。

于 2012-07-09T13:09:27.123 に答える