[英]JPA/hibernate error violation of foreign key constraint
我是hibernat的新手,并且我有两个类,并且试图将数据保存在Derby嵌入式数据库中,但是当我用出售的外键保存类'produto'时,会出现以下错误:错误:
Caused by: ERROR 23503: INSERT on table 'PRODUTOS' caused a violation of foreign key constraint 'FKIOY8UEWC87473SNMMUOPJKUVB' for key (236). The statement has been rolled back.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.sql.execute.ForeignKeyRIChecker.doCheck(Unknown Source)
at org.apache.derby.impl.sql.execute.RISetChecker.doFKCheck(Unknown Source)
at org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(Unknown Source)
at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown Source)
at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
... 82 more
Venda类别:
@Entity
@Table(name = "Venda")
@Access(value = AccessType.PROPERTY)
public class Venda {
@Id
@GeneratedValue
@Column(name = "venda_id")
public Long getId() {
return id;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "produtos_id")
public List<Produtos> getProdutos() {
return produtos;
}
public void setProdutos(List<Produtos> produtos) {
this.produtos = produtos;
}
[...]
}
产品类:
@Entity
@Table(name = "Produtos")
@Access(value = AccessType.PROPERTY)
public class Produtos {
@Id
@GeneratedValue
@Column(name = "produtos_id")
public Long getId() {
return id;
}
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "venda_id", nullable = false)
public Venda getVenda() {
return venda;
}
[...]
}
保存:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("cliente");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();
manager.persist(venda);
for (Produtos produto : produtos) {
produto.setVenda(venda);
}
for (Produtos produto : produtos) {
manager.persist(produto);
}
manager.getTransaction().commit();
manager.close();
factory.close();
除了其他答案:
...违反外键约束'FKIOY8UEWC87473SNMMUOPJKUVB'...
FKIOY8UEWC87473SNMMUOPJKUVB
确切含义,要确定真正的问题并不容易(仅通过阅读代码即可)。 FKIOY8UEWC87473SNMMUOPJKUVB
的约束。 您可以在Hibernate映射文件hbm.xml
定义自己的FK名称:
<many-to-one class="sample.SampleEntity" fetch="select" foreign-key="FK_sampleNameForFK" name="sample"> <column name="sample_id"/> </many-to-one>
@JoinColumn
仅应在关系的一侧指定。 它通常放置在拥有实体的一侧。 在“多对一”和“一对多”双向关系中,通常将其放置在使用@ManyToOne
映射的字段上。
因此,我建议删除getProdutos()
方法上的@JoinColumn
映射。 只需在多面保留一个@JoinColumn
。
此外,由于这是一种双向的关系,应指定mappedBy
的属性@OneToMany
注释,以表明这是关系的另一方。
在应用我的建议之后,这是一个示例结果代码:
@Entity
public class Venda {
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="venda")
public List<Produtos> getProdutos() {
return produtos;
}
...
}
@Entity
public class Produtos {
...
@ManyToOne
@JoinColumn(name = "venda_id", nullable = false)
public Venda getVenda() {
return venda;
}
...
}
您已在Venda实体类中放置了层叠= CascadeType.ALL。 这意味着Produto列表将保存在Venda设置中。 结果,您第二次尝试保存Produto时,由于已经保存了约束违例异常,因此它已被保存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.