编辑1:在问题结束时添加了休眠日志。
编辑2: 该问题与我的数据库相关联。如果我从单元测试中执行相同的方法(单元测试配置为使用另一个DB),则insert语句传递... 我还没有写过一件重要的事情:我正在开发一个基于架构的多租户系统。我目前有4个模式对应4个不同的客户端。我猜我有两个或更多的FK约束严重违约,并指向同一个表。我现在一直这样看。
如果有人能想到在某个字段上找到重复FK约束的方法,我很乐意阅读它。
=============================================== ==== 原帖:
Hibernate和JPA对我来说仍然很新,所以请耐心等待......
以下代码没问题。
PointAnalyse pointAnalyse = new PointAnalyse();
em.persist(pointAnalyse);
// em.flush();
ResourcesAnalyse resourcesAnalyse = new ResourcesAnalyse();
resourcesAnalyse.setPointAnalyse(pointAnalyse);
em.persist(resourcesAnalyse);
但是,如果我取消注释em.flush()
或执行任何其他数据库操作(甚至是简单的选择查询),保存resourcesAnalyse
实体时我将得到ConstraintViolationException:
ERROR: une instruction insert ou update sur la table « ressources_analyse » viole la contrainte de clé
étrangère « fk_ressources_analyse_point_analyse_id »
Détail : La clé (point_id)=(1722) n'est pas présente dans la table « point_analyse ».]]
翻译:{{1}}表中不存在ID为point_id
的FK 1722
。
如果我跟踪Hibernate查询,我可以看到在我尝试保存point_analyses
对象之前确实插入了具有此ID的行,因此不应该有任何错误。
以下是映射:
resourceAnalyse
非常感谢您阅读本文,以及是否有人可以解释我做错了什么。
以下是hibernate日志的相关部分:
@Entity
@Table(name = "point_analyse")
public class PointAnalyse implements Serializable {
@Id
@SequenceGenerator(name = "POINT_ANALYSE_ID_GENERATOR", sequenceName = "POINT_ANALYSE_ID_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "POINT_ANALYSE_ID_GENERATOR")
@XmlElement
@Getter
@Setter
private Long id;
...
}
@Entity
@Table(name = "ressources_analyse")
@NoArgsConstructor
@Getter
@Setter
public class ResourcesAnalyse implements Serializable {
@Id
@SequenceGenerator(name = "RESSOURCES_ANALYSE_ID_GENERATOR", sequenceName = "RESSOURCES_ANALYSE_ID_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "RESSOURCES_ANALYSE_ID_GENERATOR")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "point_id")
private PointAnalyse pointAnalyse;
....
}
答案 0 :(得分:0)
em.flush()或/和查询强制JPA执行SQL语句。
我假设point_id有一个非空约束。所以它尝试在没有设置point_id的情况下执行insert语句。
因此,在刷新或执行查询时,您必须确保实体对象模型是一致的。或者您必须删除非空约束。
如果必须没有null约束,则在Addionally中应将optional = false添加到ManyTo One映射。