JPA ConstraintViolationException将forgein键作为值null

时间:2016-01-22 00:30:57

标签: java hibernate jpa

我使用Hibernate迁移到JPA持久化。 我测试了两个实体,当持久化实体时,我收到了关于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'不为空。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

@Transient注释意味着实体字段是不参与持久性的字段,它们的值永远不会存储在数据库中。

答案 1 :(得分:0)

我以不同的方式实现了@Transient注释的功能......谢谢!!

这是实体更改:

UIViewController