Java 休眠-如何只保留父对象,保持子对象不变

Java 休眠-如何只保留父对象,保持子对象不变,java,hibernate,Java,Hibernate,有人能帮我理解如何配置hibernate来做我想做的事情吗 我有一个家长实体“公寓”,上面有一个孩子的“房间”列表。 我有一个表格来编辑“公寓”,在这个表格中,我列出了所有的儿童“房间”,仅供参考。房间以单独的形式添加和编辑 因此,因为我在公寓表格中列出了房间,所以我将lazyloading设置为false: @OneToMany @JoinColumn (name = "appartmentId") @LazyCollection (LazyCollectionOption.FALSE

有人能帮我理解如何配置hibernate来做我想做的事情吗

我有一个家长实体“公寓”,上面有一个孩子的“房间”列表。 我有一个表格来编辑“公寓”,在这个表格中,我列出了所有的儿童“房间”,仅供参考。房间以单独的形式添加和编辑

因此,因为我在公寓表格中列出了房间,所以我将lazyloading设置为false:

    @OneToMany
@JoinColumn (name = "appartmentId")
@LazyCollection (LazyCollectionOption.FALSE)
private List<Room> room;

<>而不是使用持久性实体,考虑使用DTOs(在Web页面的情况下,您可以称之为页面模型)。它们可以让您灵活地描述所需信息并以所需格式显示。但是你应该为此付出代价——你正在向你的系统中添加新的类,你必须想出一种方法将实体转换成DTO并向后转换

  • 不要在映射中禁用延迟抓取。用于性能调整
  • 如果您告诉Hibernate保存/更新没有房间的公寓,则Hibernate只会从公寓中删除房间

  • 这真的很简单。无需重新填充您的孩子,或创建单独的DTO

    如果您永远不会持久化这些子项,只需将insertable=false、updateable=false添加到joincolumn注释中即可。像这样:

    @OneToMany
    @JoinColumn (name = "appartmentId", insertable = false, updatable = false)
    @Fetch(value = FetchMode.JOIN)
    private List<Room> room;
    
    @OneToMany
    @JoinColumn(name=“appartmentId”,可插入=false,可更新=false)
    @Fetch(value=FetchMode.JOIN)
    私人名单室;
    
    当一个映射层足够时,没有理由使用两个映射层。我没有说过任何关于映射层的内容。DTO/VO是一个根据用途方便地描绘或发送数据的层。通常,仅仅为所有内容提供持久性实体是不够的,你应该有专门为特定目的携带信息的类。这很公平,但这与问题并不真正相关。在大多数情况下,与其强暴Hibernate,不如定义DTO。这不是对这个问题的回答,而是对这个问题的一个解决方案。如果你用一年的时间轻松地使用它,你就会明白它对你有多大的帮助,对你有多大的帮助:)如果你使用JDBC,它真的做了很多你想自己写的事情。所以尽情享受吧;)您是否在存储
    装置
    对象之前重新构建它?似乎您正在从列表中删除
    房间
    s,或者是显式删除,或者是创建一个新的空列表。我刚刚在上面添加了我的save metode。正如您所看到的,在存储Apartment对象之前,我并没有对它做任何事情。
    Apartment
    来自哪里?(旁注:它的拼写是公寓;-)嗯,struts2是一个相当新的对象,我只能想象它应该是在edit()方法中设置的同一个对象。edit方法测试id是否为null,如果不是null,则从数据库获取appartment对象。如果为null,则创建新实例。对于这种特殊情况,id永远不会为空,因为它只用于编辑,而不是创建新的。谢谢!1.刚刚实施了抓取策略,效果很好。2.调用保存操作时,所有房间都将从公寓对象中消失。再打一次电话给db重新填充房间列表似乎是不必要的,这样在保留公寓时它就不会被触动。这真的应该是这样吗?我假设您正在尝试创建一个新实例,手动设置主键属性,然后保存它。这注定会在很多方面失败。更新实体的正确方法是首先加载它,然后在事务中对其进行更改。我想说的是:我只想更新appartment对象。这等于一条db语句(更新装置集…等等)。不应该要求加载所有的子项,这样当子项保持不变时可以保存父项1.使用延迟加载,您不会加载所有的子项1.我不知道我缺少了什么。但根据我的经验,当表单提交时(在save操作中),appartment.getRooms()方法将返回null。因此,为了使它不返回null,我必须首先执行以下操作:appartment.setRooms(appartmentHibernateImpl.get(appartmentId.getRooms());因此额外打了一个db电话。这不对吗?谢谢!正是我想要的。简单、干净、直截了当!@user829237:你意识到这意味着你永远不能仅仅通过将房间添加到房间列表来将房间添加到公寓中,对吗?
    @OneToMany
    @JoinColumn (name = "appartmentId", insertable = false, updatable = false)
    @Fetch(value = FetchMode.JOIN)
    private List<Room> room;