【问题标题】:Removing entity violates not null constraint on field删除实体违反了字段的非空约束
【发布时间】:2015-08-17 12:44:26
【问题描述】:

我有这个实体

@Entity
class PieceAvailable {

    ...

    @JoinColumn(name = "id_product", referencedColumnName = "id_product")
    @ManyToOne(optional = false)
    private Product idProduct;

    ...

}

我也有 Product 实体,但它的代码几乎无关紧要(产品与 PieceAvailable 之间没有关系)。

还有一个代码

PieceAvailable pa = entityManager.find(PieceAvailable.class, 52);
entityManager.remove(pa);

persistence.xml(testPU persistence-unit 可能暂时不用)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="crm-ejbPU" transaction-type="JTA">
    <jta-data-source>jdbc/crm</jta-data-source>
    <class>my.company.crm.server.entity.CrmSetting</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>

    </properties>
  </persistence-unit>
  <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>my.company.crm.server.entity.CrmSetting</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
  </persistence-unit>
</persistence>

抛出异常:

引起:javax.persistence.PersistenceException:异常 [EclipseLink-4002](Eclipse 持久性服务 - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException 内部 异常:org.postgresql.util.PSQLException:错误:空值 列“id_product”违反非空约束详细信息:失败行 包含 (null)(52, null, 2015-08-12 16:05:41.166, 1, 205.33000000000001,空,空,空,空,空,2015-08-12 16:05:41.166,0,空)。错误代码:0 调用:UPDATE piece_available SET id_invoice_position_pz = ?, id_piece_available_original = ?, id_product = ?, id_store = ? WHERE (id_piece_available = ?) 绑定 => 【5个参数绑定】

我的目标是删除明确说明的实体。我不知道为什么eclipselink首先用null填充关系。但它正在发生。这违反了显然在我的 PostgreSQL 中设置的非空约束。在 JPA 中也明确指出,对于这个映射 optional = false。所以它是必需的。

如何避免此异常?我不想删除这个非空约束。

【问题讨论】:

  • 你能发布一些额外的代码和配置吗?我没有针对 PostgreSQL 尝试过这个,但我尝试了相同的场景,这对我有用,删除语句是在插入后生成的,没有执行更新。
  • 您能说得更具体些吗?有什么用?我可以尝试准备最小的项目,但这会很费力
  • 这实际上正是我自己做的,我创建了一个简单的maven项目,只导入了EclipseLink、junit和hsqldb,创建了两个简单的实体和一个测试方法。如果您可以分享类似的东西,那将是理想的。或者,您可以从分享您的 persistence.xml 以及在您的案例中执行删除的确切代码开始。
  • 请向我们展示相关表的create table 语句(包括所有约束定义)。但我认为这个错误很明显。 piece_available.id_product 列是使用 NOT NULL 创建的。如果您确实希望在其中允许 null 值,则需要从 create table 语句中删除该约束。
  • 我在帖子中添加了 persistence.xml。关于代码...... entityManager 的这两行正是引发异常的行。如果您想知道其他任何事情,请告诉我。与此同时,我尝试创建最小的项目。

标签: postgresql jpa eclipselink


【解决方案1】:

当我为此主题准备最小示例项目时,我发现我的 PieceAvailable 实体非常罕见。

@Entity
@Table(name = "piece_available")
public class PieceAvailable implements Serializable {

    ...

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_piece_available")
    private Integer idPieceAvailable;

    @JoinColumn(name = "id_product", referencedColumnName = "id_product")
    @ManyToOne(optional = false)
    private Product idProduct;

    @JoinColumn(name = "id_piece_available_original", referencedColumnName = "id_piece_available")
    @ManyToOne(optional = true)
    private PieceAvailable idPieceAvailableOriginal;

    ...
}

PieceAvailable 实体将关系映射到自身(字段 idPieceAvailableOriginal),在我的应用程序中的某些情况下,实体似乎映射到自身。在这些情况下,UPDATE 语句将在删除之前发生。所以当我坚持这样的实体时:

PieceAvailable pa = new PieceAvailable();
...
pa.setIdPieceAvailableOriginal(pa);

然后在使用上述实体作为参数调用删除方法后,我将得到我的异常。

我必须解决这个奇怪的关系。但是现在我发现作为解决方法,我可以在删除之前在 idPieceAvailableOriginal 中设置 null 并且不会出现任何异常。

PieceAvailable pa = entityManager.find(PieceAvailable.class, 52);
pa.setIdPieceAvailableOriginal(null);
entityManager.remove(pa);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2021-01-21
    • 2018-09-12
    • 2021-11-02
    相关资源
    最近更新 更多