2013-08-07 38 views
1

我正在使用Eclipselink并面临删除问题。 我有ManyToOne加入如下。删除因updateForeignKeyFieldBeforeDelete中的数据库异常而失败

public class UserEntity implements Serializable { 
... 
@ManyToOne 
@JoinColumn(name = "STUDENT_CD", nullable=false) 
private StudentEntity student; 
} 

虽然试图删除UserEntity,但我得到了下面的异常。

[#|2013-08-07T20:44:52.105+0530|WARNING|glassfish3.1.2|javax.enterprise.resource.jta.com.sun.enterprise.transaction|_ThreadID=35;_ThreadName=Thread-2;|DTX5014: Caught exception in beforeCompletion() callback: 
Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: ORA-01407: cannot update ("SERVICE"."USERS"."STUDENT_CD") to NULL 

Error Code: 1407 
Call: UPDATE SERVICE.USERS SET STUDENT_CD = ? WHERE (USER_ID = ?) 
    bind => [null, 1] 

    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:840) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:592) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1717) 
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.updateObject(DatasourceCallQueryMechanism.java:749) 
    at org.eclipse.persistence.internal.queries.StatementQueryMechanism.updateObject(StatementQueryMechanism.java:432) 
    at org.eclipse.persistence.internal.queries.CallQueryMechanism.updateForeignKeyFieldBeforeDelete(CallQueryMechanism.java:436) 

这里提到它是一个bug。 https://bugs.eclipse.org/bugs/show_bug.cgi?format=multiple&id=341709

该问题发生在Eclipselink 2.4中。

有什么建议吗?

UPDATE

@Entity 
@Table(name = "USER", schema="SERVICE") 
public class UserEntity implements Serializable { 
... 
// bi-directional many-to-one association to StudentEntity 
@ManyToOne 
@JoinColumn(name = "STUDENT_CD", nullable=false) 
private StudentEntity student; 
... 
} 

@Entity 
@Table(name = "STUDENT", schema="SERVICE") 
public class StudentEntity implements Serializable { 
... 
@Id 
@Column(name = "STUDENT_CD") 
private String studentCd; 

@OneToMany(mappedBy = "student") 
private Set<UserEntity> users; 
... 
} 

我是新来的JPA。根据我的理解,没有循环。

回答

0

请包括您的全班级映射,包括所有关系和完整的SQL跟踪。

当EclipseLink检测到一个循环时,它将在删除期间仅删除外键。即,您要删除两个或多个通过外键互相引用的对象。从技术上讲,没有办法删除这个模型,因为从任何一方删除都会导致违反外键约束。

您可能希望重新考虑您的模型,使其不具有双向外键依赖性。通常情况下,当你有双向关系时,你将在一边使用“mappedBy”,因此只有一个外键用于两个关系。

如果你有一个循环和非空约束,那么你可能已经使你的数据不可能被删除,这可能是一个坏主意。您需要放松其中一个限制。如果其中一个外键不为空,而一个外键可为空,则可以在删除对象之前将可空对象设置为null以避免循环。您还可以使用constraintDependency来影响EclipseLink的哪个方面。

您也可以尝试2.5.2版本,它并没有考虑到空约束。

+0

由于篇幅限制评论,我回答了问题。 – user2455158

相关问题