我使用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'不为空。
谢谢!
答案 0 :(得分:1)
尝试从@Transient
类的azienda
属性中删除Agente
注释。
@Transient
注释意味着实体字段是不参与持久性的字段,它们的值永远不会存储在数据库中。
答案 1 :(得分:0)
我以不同的方式实现了@Transient注释的功能......谢谢!!
这是实体更改:
UIViewController