Java 在JPA2.0中维护关系

Java 在JPA2.0中维护关系,java,hibernate,jpa,orm,jpa-2.0,Java,Hibernate,Jpa,Orm,Jpa 2.0,我已经使用JPA2.0有一段时间了,但遗憾的是,我没有足够的时间来正确地学习它。我似乎缺少如何使用实体管理器的基础知识 一步一个脚印,我想先问一下如何维护映射实体之间的关系。当然,我知道如何在实体之间创建映射、不同类型的可用关联(OneToOne等)以及数据库通常是如何工作的。我只专注于通过实体管理器对其进行维护,因此请不要将我发送到任何类型的常识教程:-) 问题是: 作为一名程序员,我负责维护(创建/更新/删除)实体实例之间的关系,对吗 我是否必须始终手动更新(设置为null、从集合中删除等)

我已经使用JPA2.0有一段时间了,但遗憾的是,我没有足够的时间来正确地学习它。我似乎缺少如何使用实体管理器的基础知识

一步一个脚印,我想先问一下如何维护映射实体之间的关系。当然,我知道如何在实体之间创建映射、不同类型的可用关联(
OneToOne
等)以及数据库通常是如何工作的。我只专注于通过
实体管理器
对其进行维护,因此请不要将我发送到任何类型的常识教程:-)

问题是:

  • 作为一名程序员,我负责维护(创建/更新/删除)实体实例之间的关系,对吗
  • 我是否必须始终手动更新(设置为null、从集合中删除等)实例
  • 普通SQL可以在删除时将实体设置为NULL,但JPA似乎不能做这么简单的事情。手动操作似乎也是一种负担。有没有办法通过JPA实现这一点
  • 如果我有
    OneToMany
    关系,并将关系的
    Many
    一侧的实体设置为空。然后通过在
    One
    侧保存实体,将更改持久化到集合中。然后我是否必须更新
    Many
    侧中的实体,并在每个实例中将关联设置为NULL?对于单向绑定来说,这似乎是纯粹的愚蠢
    提前谢谢

    您需要研究的主要问题是在实体上映射时的不同选项。例如,在下一段代码中,cascade all选项将指示jpa在删除父列表时删除子列表

    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, mappedBy = "parent")
    private Set<Child> events = new HashSet<Child>();
    
    @OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.ALL},mappedBy=“parent”)
    private Set events=new HashSet();
    
  • 对。维护对象树并将其修改为 你想要的
  • 是和否。如果希望实体引用null,则选择是。 例如,如果要删除一个实体,则应清除 将其他实体持有的对它的任何引用 移除。一个实际的例子:让员工 知道他/她的经理已被解雇。如果员工要 保留,它应该将其manager引用置空或设置为空 在删除当前管理器之前,将其发送到其他管理器。
    如果该员工也将被解雇,则级联删除 可以级联到经理的所有下属,在这种情况下,您可以 不需要清理他们对经理的引用-因为他们是这样的 我也要走了
  • 我不太明白什么样的SQL设置为null。删除 删除数据库中的行,因此没有任何设置 无效的在将来清理参考资料应该不会那么困难 对象模型,因为JPA有许多事件需要帮助,例如 preremove preupdate等。但最后,问题在于 您的java对象。它们只是java对象,所以如果您需要 一旦完成,您的应用程序将需要在最短的时间内完成 部分JPA负责构建它们并将它们推送到数据库, 不为你改变状态
  • 是和否。如果你建立了双向关系,你必须 如上所述,对两侧进行维护。如果你把孩子的 父项引用为null,您应该让父项知道它否 你不再有孩子了,是吗?你的父母将继续 只要父实例存在,就引用其子实例。所以 即使数据库是通过 如果拥有关系,则对象模型将与 直到数据库刷新或以某种方式重新加载。JPA允许 多层次的缓存,因此这一切都取决于您的提供商设置 引用不存在的子实例的父实例将存在多长时间 数据库中不再存在

  • 在第4点中,我想问以下问题:我想删除
    父实体和它的
    子实体之间的链接。在我的代码中,我获取
    父项
    ,并清除将子项设置为
    空集
    。然后我保存
    父项
    。对我来说,这应该足够了,但是如何正确清理链接的另一面呢?我是否应该首先迭代子级,将
    parent
    设置为
    null
    em.persist(child)
    ?我会想象
    em
    聪明到足以理解我所做的事情并自动清理那些引用!你能详细说明一下吗?这取决于你想发生什么。如果没有父级的子级不应存在,请将其与新父级关联,或设置孤立删除标志,JPA将在取消引用子级时删除这些子级。如果你想让他们独立存在,你需要告诉他们他们的当前状态应该是什么,当然,合并它。某些提供程序(EclipseLink)可能仍然有遗留的EJB2.0代码,可以为您处理另一端的空值。这种关系维护造成的问题超出了它的价值,并且被故意从JPA规范中排除。如果对每个被修剪的子级调用merge是一个问题,那么可以使用许多方法。一个简单的方法是将修剪过的对象存储在一个未持久化的集合中,然后在父对象上的preupdate事件方法中使用该集合。此方法将根据需要进行列表修复和合并。