删除实体违反了字段

时间:2015-08-17 12:44:27

标签: postgresql jpa eclipselink

我有这个实体

@Entity
class PieceAvailable {

    ...

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

    ...

}

我也有Product实体,但它的代码几乎无关紧要(从Product回到PieceAvailable没有任何关系)。

还有一个代码

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

persistence.xml(testPU持久性单元现在可能没有使用)

<?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:错误:null值   列“id_product”违反非空约束详细信息:失败行   contains(null)(52,null,2015-08-12 16:05:41.166,1,   205.33000000000001,null,null,null,null,null,2015-08-12 16:05:41.166,0,null)。错误代码:0呼叫: UPDATE piece_available SET   id_invoice_position_pz =?,id_piece_available_original = ?,   id_product =?,id_store =? WHERE(id_piece_available =?) bind =&gt;   [5个参数绑定]

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

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

1 个答案:

答案 0 :(得分:0)

当我为这个主题准备最小的示例项目时,我发现我的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);

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

我将不得不修复这种奇怪的关系。但是现在我发现作为一种解决方法,我可以在删除之前在idPieceAvailableOriginal中设置null,并且我不会得到任何异常。

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