gpt4 book ai didi

java - 由于 updateForeignKeyFieldBeforeDelete 中的数据库异常,删除失败

转载 作者:行者123 更新时间:2023-12-01 04:29:34 26 4
gpt4 key购买 nike

我正在使用 Eclipselink 并面临删除问题。我有 ManyToOne 加入,如下所示。

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)

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

该问题出现在 Eclipselink 2.4 中。

有什么建议吗?

更新

@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 新手。据我了解,没有循环。

最佳答案

请包含完整的类映射(包括所有关系)以及完整的 SQL 跟踪。

当EclipseLink检测到循环时,它只会在删除过程中将外键设为空。即,您要删除两个或多个通过外键相互引用的对象。从技术上讲,无法删除此模型,因为任何一方的删除都会导致外键约束违规。

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

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

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

关于java - 由于 updateForeignKeyFieldBeforeDelete 中的数据库异常,删除失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com