java - JPA ConstraintViolationException 外键值为 null

标签 java hibernate jpa

我迁移到 JPA 并与 Hibernate 保持一致。 我使用两个实体进行测试,当持久化一个实体时,我收到了 forgein 键的 null 值违反约束的异常。

这是数据库表的结构:

CREATE TABLE AZIENDA
(AZN_ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
...

CREATE TABLE AGENTE
(AGN_ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    AGN_IDAZN INTEGER NOT NULL,
...
CONSTRAINT FK_AGN_AZN FOREIGN KEY (AGN_IDAZN) REFERENCES AZIENDA (AZN_ID) ON DELETE CASCADE);

实体:

@Entity
@Table(name="AZIENDA")
public class Azienda {    
    @Column(name="AZN_ID")    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
...
@Entity
@Table(name="AGENTE")
public class Agente {   
    @Column(name="AGN_ID")    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name="AGN_IDAZN")
    @JoinColumn(name="FK_AGN_AZN", referencedColumnName="AZN_ID")
    @ManyToOne()
    // @ManyToOne(optional=true, cascade=CascadeType.PERSIST)
    @Transient
    private Azienda azienda;
...

首先从数据库中检索对象“Azienda”,然后创建一个新的“Agente”实体并设置属性“azienda”,当创建并保存新实体“Agente”时,我收到 ConstraintViolationExcpetion 列“AGN_IDAZN”可以'不包含 null 值,但实例 'Azienda' 不为 null。

谢谢!!

最佳答案

尝试从 Agente 类的 azienda 属性中删除 @Transient 注释。

@Transient 注解表示实体字段是不参与持久化的字段,其值永远不会存储在数据库中。

关于java - JPA ConstraintViolationException 外键值为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34936983/

相关文章:

java - 将 CompletableFuture 与 RxJava 抽象结合使用

java - 如何创建需要动态参数的对象

java - 显示最终解,显示小数点后 2 位

java - java中如何设计JPA多态关系?

java - JPA 方法可以延迟加载整个实体图而无需 1+n+n*m 查询?

java - Spring 数据 JPA 多对多检索

java - 无法从 Windows 中的 Tomcat 服务器访问资源

java - 同表级联删除

java - Spring 数据保存与 saveAll 性能

java - 定义 id 映射到表中非主列的 hibernate hbm 文件是否合适