级联保留父级后,子级的 id 不存在

2023-12-28

我有一个User(家长)和一个Home(子)实体遵循单向一对多关系相关。

我的问题是,当添加新的Home to a User,新创建并保留的Home没有id。这是正常的吗?如果我想要 id,我需要手动保留孩子吗?

这些是我的实体:

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @NotNull
    @Column(name = "firstName")
    private String firstName;

    @NotNull
    @Column(name = "lastName")
    private String lastName;

    @NotNull
    @Column(name = "email")
    private String email;

    @OneToMany(targetEntity = Home.class, fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)
    @JoinColumn(name = "userId", referencedColumnName = "id", nullable = false)
    private List<Home> homes;


    public User() {
    }

    public void addHome(Home home) {
        homes.add(home);
    }
}



@Entity
@Table(name = "home")
public class Home implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @NotNull
    @Column(name = "isActive")
    private Boolean isActive;


    public Home() {
    }

}

以及更新父级的代码:

Home home = HomeParser.parse(homeDTO);
User user = userService.findById(userId);
user.addHome(home);
userService.update(user); // delegate call to getEntityManager().merge(user);

此时我以为我会home拥有在持久化到数据库时刚刚给出的 id,但事实并非如此。

我已经尝试添加insertable = false到家庭的 id@Column,如所指出的here https://stackoverflow.com/questions/32045577/childs-id-is-not-assigned-from-parent-on-persist,但它也不起作用。


EntityManager.merge方法实现委托给 HibernateSession.merge https://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#merge%28java.lang.Object%29:

使用以下命令将给定对象的状态复制到持久对象上 相同的标识符。如果当前没有持久化实例 与会话关联,它将被加载。返回持久化的 实例。如果给定实例未保存,请保存 和 的副本 将其作为新的持久实例返回。给定的实例不 与会话关联。该操作级联到 关联实例(如果关联映射为)cascade="merge".

注意粗体部分。基本上,merge操作将被级联到Home您创建的实例,但 Hibernate 将创建该实例的副本,将您的实例合并到该副本中,保存该副本并将您的实例替换为User.homes收藏。

在这之后,User.homes集合应包含以下内容的副本Home具有正确初始化的 id 的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

级联保留父级后,子级的 id 不存在 的相关文章

随机推荐

  • 在expo中运行使用react-native-cli创建的react-native应用程序

    我是一个反应原生初学者 在我之前的教程中 我使用以下命令创建了应用程序react native init AppName但现在有一种新的使用方法create react native app AppName 使用后一种方法创建的应用程序使用
  • Material UI 抽屉不会在 Appbar 下移动

    我有一个应用栏和它下面的一个抽屉 在这两个组件下我有 3divs与引导程序和在每个div我有一组按钮 问题是抽屉覆盖了应用栏 我似乎无法移动它 这是我的代码 div div
  • 如何通过tree shake告诉Webpack不要读取(排除)无法访问的文件?

    看起来 Webpack 的 Tree Shaking 功能有助于从包中删除未使用的代码 然而 Webpack 确实会读取这些不可读的文件 我如何告诉 Webpack 不要读取它们 这是一个例子 index js import bar fro
  • 删除记录/数据后如何重新加载数据表?

    我已经生成了记录 每行都有删除按钮 当我单击删除按钮时 它将从数据库中删除记录 另外 删除后它将重新加载数据表 有什么帮助吗 数据表 var table table DataTable processing true some settin
  • 类型错误:opendirSync 不是函数

    我正在编写一个电子应用程序 我想使用 fs 模块的 opendirSync 函数来计算目录中的文件数量 但是 我收到以下错误 node 12944 UnhandledPromiseRejectionWarning TypeError fs
  • Symfony2 的 AccessDeniedHandlerInterface 自动重定向未经授权的用户

    当实施AccessDeniedHandler接口 http api symfony com 2 5 Symfony Component Security Http Authorization AccessDeniedHandlerInter
  • 班级助手有什么用处?

    Delphi 可能还有很多其他语言 有类助手 它们提供了一种向现有类添加额外方法的方法 无需创建子类 那么 类助手有什么用处呢 我正在使用它们 To 插入枚举器 http 17slon com blogs gabr 2007 03 fun
  • GCM 寄存器阻塞 AsyncTask,直到发生超时

    我正在尝试使用 GCM 获取我的设备注册 ID 我执行此操作的代码包含在从我的主线程调用的 AsyncTask 中 主要代码 try String deviceId new Gcm execute this activity get 5 T
  • 迭代哈希集合

    Journal gt 4 785 0 13 21 9165000915527 14 213 008995056152 15 50 074499130249 如何在 Ruby 中迭代此哈希 以及如何分离键和值 Ruby 有一个统一的迭代接口
  • 如何在 Flask 中“jsonify”列表? [复制]

    这个问题在这里已经有答案了 现在Flaskjsonify 列表时会引发错误 我知道可能存在安全原因https github com mitsuhiko flask issues 170 https github com mitsuhiko
  • 如何使用 imagemagick 将两个文件夹中的图像并排合并到一起?

    我有两个文件夹 A and B 以及具有相应名称的图像文件 例如 每个都包含标记为01 png 02 png 03 png etc 我怎么能够merge相应的文件 这样我就有了第三个folder C其中包含所有合并的照片 以便两张原件并排放
  • Github API 响应“内容无效 Base64”

    使用 API 将某个非常简单的内容发布到 github 时 我收到 内容不是有效的 Base64 错误 内容是 unit li class s clearfix li 我正在使用 Base64 urlsafe encode64 对内容进行编
  • 算法优化-多点之间的最短路径

    问题 我有大量的点集合 这些点中的每一个都有一个列表 其中包含对其他点的引用 以及它们之间的距离已经计算并存储 我需要确定从起点开始并经过特定数量的点到达任何目的地的最短路线 例如 我正在度假 并且住在某个特定的城市 我正在进行一次单程旅行
  • 是否可以从 aspnet core api 中的中间件向控制器发送值?

    我想知道是否可以将值从中间件发送到controllerAPI 例如 我想捕获一个特定的标头并将其发送到控制器 像这样的东西 public class UserTokenValidatorsMiddleware private readonl
  • JSP简单密码加密解密

    我需要加密密码以插入数据库 此外 当我需要该密码时 我需要解密该值 执行此操作的简单方法是什么 注意 此操作不必非常安全 请不要实施您当前的计划 而应该使用信息摘要 http docs oracle com javase 7 docs ap
  • 表格内的绝对定位

    我需要在 td 内使用绝对定位来定位某些内容 为了解决 td 在将其设置为相对时未定义的事实 我在 td 内使用设置为相对的 div 然后在该 div 内将内部 div 设置为绝对 当我有内容填满 td 时 这一切都非常有效 当我将 td
  • 使用 Spring AMQP 接收和发送 Java 对象

    我想实现 Spring AMQP 示例 用于使用侦听器发送和接收 Java 对象 我试过这个 发送Java对象 ConnectionFactory connectionFactory new CachingConnectionFactory
  • 从 Redis 列表中删除特定索引处的元素

    是否可以删除 Redis 列表中特定索引处的元素 并没有真正找到我想要的东西 有 Trim 允许您选择一组特定的元素 LREM 允许您按值删除列表中的项目 但我没有该值 我发现了一个 hack 您可以使用 LSET 将元素的值更改为 UID
  • iPhone Xs 和 Xs Max 在 iTunes 上没有显示 UDID?

    对于运行 iOS 12 的 iPhone Xs 和 Xs Max UDID 不会显示在最新版本的 iTunes 12 9 中 有谁知道如何从新版iTunes获取UDID吗 到目前为止 我成功地从 Xcode 获得了 24 位代码 我使用的是
  • 级联保留父级后,子级的 id 不存在

    我有一个User 家长 和一个Home 子 实体遵循单向一对多关系相关 我的问题是 当添加新的Home to a User 新创建并保留的Home没有id 这是正常的吗 如果我想要 id 我需要手动保留孩子吗 这些是我的实体 Entity