Hibernate:在保存之前刷新时违反约束

时间:2016-03-16 17:01:59

标签: java hibernate jpa

编辑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;

....
}

1 个答案:

答案 0 :(得分:0)

em.flush()或/和查询强制JPA执行SQL语句。

我假设point_id有一个非空约束。所以它尝试在没有设置point_id的情况下执行insert语句。

因此,在刷新或执行查询时,您必须确保实体对象模型是一致的。或者您必须删除非空约束。

如果必须没有null约束,则在Addionally中应将optional = false添加到ManyTo One映射。