我有这个实体
@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。所以这是必需的。
如何避免此异常?我不想删除这个非空约束。
答案 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);