当前位置: 首页 > 知识库问答 >
问题:

删除实体违反了字段上的not null约束

雷晋
2023-03-14

我有这个实体

@Entity
class PieceAvailable {

    ...

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

    ...

}
PieceAvailable pa = entityManager.find(PieceAvailable.class, 52);
entityManager.remove(pa);
<?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:Exception[EclipseLink-4002](Eclipse Persistence.Exceptions.databaseException内部异常:org.PostgreSQL L.util.psqlException:错误:列“id_product”中的null值违反了not-null约束详细信息:Failing row contains(null)(52,null,2015-08-12 16:05:41.166,1,205.330000000001,null,null,null,null,null,错误代码:0调用:UPDATE piece_available SET id_invoice_position_pz=?,id_piece_available_original=?,id_product=?,id_store=?其中(id_piece_available=?)绑定=>[5个参数绑定]

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

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

共有1个答案

危飞文
2023-03-14

当我为这个主题准备最小的示例项目时,我发现我的零碎可用实体非常不常见。

@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);
 类似资料:
  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • 问题内容: 该环境在Linux上为WAS 6.1,部署了一个使用xercesImpl.jar中的类的webapp。 由于公司政策的限制,该应用必须使用以下设置进行部署: WAR文件包含xercesImpl.jar的副本,该副本与编译应用程序时在类路径中的副本相同。 当启动webapp时,当Spring尝试解析其配置时,它会抛出: 分析如此之遥 似乎WAS提供了org.apache.xerces.j

  • 以下是SQL部分,我在调试代码时出错: ORA-00001:唯一约束主键违反T_LIAV_AGENT_STATE_APPROVAL... 这是主键约束依赖的2列AV_NAME_ID,AV_STATE... 我没有重复的数据...你认为还有其他原因吗?

  • 问题内容: 什么是防止在创建约束约束之前检查约束的最佳机制?实体的修改? 假设“用户”实体具有“ loginid”作为唯一约束,明智的做法是在创建或修改之前检查是否已存在具有该loginid名称的用户条目。 要么 您是否要让数据库抛出ConstraintViolationException并在UI层中适当地处理此消息。在jboss接缝框架中应在哪里执行此类检查。 注意:目前,没有对seam-gen

  • 我有一个笑话模型: 现在,当我试图迁移最后一行时,我得到了错误。基本上,我想将一个用户链接到Joke对象,因为我已经有了一个数据库,所以我希望默认值为1,这是管理员用户的id(我检查过了...).Makemigrations工作正常,但是当我尝试迁移时,我得到了这个: 我真的不明白怎么了。有什么想法吗?

  • 在非常简单的表上运行下面的sql语句时,我收到了下面的错误。这里使用的唯一外键是表中的,外键是,它引用了。我不确定为什么我会收到这个错误,因为我试图在删除它们所依赖的样本之前删除所有运行。下面的代码: java代码: String deleteRunsQuery="DELETE FROM运行";//从运行表中删除行String deleteSamplesQuery="DELETE FROM样本";