Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于UpdateForeign KeyfieldBeforeDelete中存在数据库异常,删除失败_Java_Jpa_Eclipselink - Fatal编程技术网

Java 由于UpdateForeign KeyfieldBeforeDelete中存在数据库异常,删除失败

Java 由于UpdateForeign KeyfieldBeforeDelete中存在数据库异常,删除失败,java,jpa,eclipselink,Java,Jpa,Eclipselink,我正在使用Eclipselink并在删除中面临问题。 我有许多人加入如下 public class UserEntity implements Serializable { ... @ManyToOne @JoinColumn(name = "STUDENT_CD", nullable=false) private StudentEntity student; } 在尝试删除UserEntity时,我得到以下异常 [#|2013-08-07T20:44:52.105+0530|WARNING|

我正在使用Eclipselink并在删除中面临问题。 我有许多人加入如下

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。

这个问题出现在Eclipselink 2.4中

有什么建议吗

使现代化
我是JPA的新手。据我所知,没有循环。

请包含完整的类映射,包括所有关系和完整的SQL跟踪

当EclipseLink检测到一个周期时,它只会在删除过程中使外键为空。i、 e.删除两个或多个通过外键相互引用的对象。从技术上讲,无法删除此模型,因为任何一方的删除都会导致违反外键约束

您可能希望重新考虑您的模型,使其不具有双向外键依赖关系。通常,当您具有双向关系时,您将在一侧使用mappedBy,因此两个关系仅使用1个外键

如果您有一个循环,并且没有空约束,那么您可能使您的数据无法删除,这可能是一个坏主意。您需要放松其中一个约束。如果其中一个外键不为null且一个可为null,则可以在删除对象之前将可为null的外键设置为null,以避免循环。您还可以使用constraintDependency影响哪一侧的EclipseLink为空


您也可以尝试2.5.2版本,它考虑了非空约束。

由于评论空间的限制,我已经回答了问题。
@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;
...
}