gpt4 book ai didi

java - 如何使用纯 JPA/Hibernate 注释避免违反外键约束

转载 作者:行者123 更新时间:2023-11-29 08:46:20 26 4
gpt4 key购买 nike

一段时间以来,我一直在处理我的数据库模型的问题。我使用 Hibernate 来管理我的实体,整个东西都存储在 HSQLDB(内存数据库) 中,因此表是在运行时由 hibernate 创建的。我的注释类的一个简短示例如下所示:

@Entity
@Table(name = "Paper")
public class Paper {
@Id
@Column(name = "ID")
private Long id;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "Paper_Ref", joinColumns = { @JoinColumn(name = "SrcID") }, inverseJoinColumns = { @JoinColumn(name = "DstID") })
private Set<Paper> references = new HashSet<Paper>();
}

@Entity
@Table(name = "Paper_Ref")
public class PaperRef
{
@Id
private Long id;

@Column(name = "SrcID")
private Long srcId;

@Column(name = "DstID")
private Long dstId;
}

如您所见,一篇论文链接到其他几篇论文,对应关系存储在名为 Paper_Ref 的表中。 SrcID 和 DstID 对 Paper 的主键具有外键性质。但是所寻址的主键不一定存在于我的数据库中。

整个工作正常,但如果数据中存在一些不一致(例如,在添加相应论文之前添加论文引用),我会违反外键约束。此外,我无法真正手动控制这些不一致,因为我从另一个没有任何限制的来源接收数据。

通常这就是每个人都希望这种关系如何运作的方式,但我正在寻找一种方法来避免违规或干脆忽略它。例如,通过手动删除约束。

我自己的解决方法是形成一个本地查询,如下所示:

SELECT p FROM Paper AS p WHERE p.id IN (SELECT pr.dstId FROM PaperRef pr WHERE srcId = :id)

但我更喜欢使用原生 hibernate 解决方案,我可以在其中为我的论文集调用 getter,而无需使用自制查询。

是否有任何方法可以删除/禁用外键约束或其他方法来解决此问题?还是我误解了hibernate中的关系是如何工作的?

提前致谢!

最佳答案

我想我现在确实解决了问题。感谢所有读者和贡献者。 HSQLDB 提供了一个在运行时禁用外键检查的选项。 SQL语句如下:

SET DATABASE REFERENTIAL INTEGRITY FALSE;

关闭此功能会产生另一个后果,HSQLDB Docs 中也提到了这一点. Hibernate 不再跟踪在数据库中所做的更改,因此如果没有进一步的操作,则会为关系(子选择)返回不完整的结果。要解决此问题,必须为可能已分离的每个对象 调用EntityManager.refresh()!

我只是使用内存数据库来获得连接功能,因为外部服务不提供这样的功能。之后我删除了实体,所以这对我来说不是什么大问题。

编码愉快!

关于java - 如何使用纯 JPA/Hibernate 注释避免违反外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25138957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com