【发布时间】: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