使用 Hibernate 映射双向列表

2024-04-14

我不明白映射双向列表时 Hibernate 的行为。 Hibernate 生成的 SQL 语句对我来说似乎不是最佳的。有人可以启发我吗?

场景如下:我有一对多的父子关系。我用双向列表来映射这种关系。

根据Hibernate 注解参考指南 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/(章节:与索引集合的双向关联)映射应该如下所示:

@Entity
public class Parent {

    @Id  @GeneratedValue private long id;
    @Version  private int version;
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id", nullable=false)
    @org.hibernate.annotations.IndexColumn(name = "parent_index")
    List<Child> children = new ArrayList<Child>();

...

@Entity
public class Child {

    @Id @GeneratedValue private Long id;
    @Version private int version;
    private String name;

    @ManyToOne
    @JoinColumn(name = "parent_id", updatable = false, insertable = false, nullable=false)
    private Parent parent;

...

但在这种情况下,当持久化父级和一个子级时,Hibernate 会生成三个 SQL 语句:

Hibernate: insert into Parent (name, version, id) values (?, ?, ?)
Hibernate: insert into Child (name, price, version, parent_id, parent_index, id) values (?, ?, ?, ?, ?, ?)
Hibernate: update Child set parent_id=?, parent_index=? where id=?

第三条语句似乎是多余的,因为parent_id and parent_index似乎已经在第二个语句中设置了。

当我更改映射并重复属性时'可更新=假,可插入=假' 的声明@JoinColumn在父级中这样:

@Entity
public class Parent {

    @Id  @GeneratedValue private long id;
    @Version  private int version;
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id", updatable = false, insertable = false, nullable=false)
    @org.hibernate.annotations.IndexColumn(name = "parent_index")
    List<Child> children = new ArrayList<Child>();

...

@Entity
public class Child {

    @Id @GeneratedValue private Long id;
    @Version private int version;
    private String name;

    @ManyToOne
    @JoinColumn(name = "parent_id", updatable = false, insertable = false, nullable=false)
    private Parent parent;

...

...那么 Hibernate 似乎会产生更加优化的 SQL:

Hibernate: insert into Parent (name, version, id) values (?, ?, ?)
Hibernate: insert into Child (name, price, version, parent_id, parent_index, id) values (?, ?, ?, ?, ?, ?)

客户端代码如下所示:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Parent newParent = new Parent();
    newParent.setName("Parent1");

    Child newChild = new Child();
    newChild.setName("Child1");

    newParent.getChildren().add(newChild);
    newChild.setParent(newParent);

    em.persist(newParent);

    em.flush();
    tx.commit();

我正在使用 hibernate-entitymanager 3.4.0.GA。

我缺少什么? Hibernate 参考指南是否不正确,或者我是否忽略了某些内容?


好吧,我没有足够彻底地阅读《注释参考指南》。

在章节中2.2.5.3.1.1。双向 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-association明确指出:

要映射双向一对多,以一对多侧作为拥有侧,您必须删除mappedBy元素并将多对一@JoinColumn设置为可插入和可更新为false。这个解决方案显然没有优化,会产生一些额外的 UPDATE 语句.

在中重复此信息可能不会有什么坏处第 2.4.6.2.1 章。与索引集合的双向关联 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-collection .

现在问题仍然存在:如果我在父级上重复 @JoinColumn 属性“updatable = false”和“insertable = false”(请参阅​​第一篇文章中的代码),则附加更新语句似乎不会生成...这是一个合法的解决方法?或者这会导致另一个问题吗?

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

使用 Hibernate 映射双向列表 的相关文章

  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的
  • 根据 Mathematica 中的另一个列表值拆分列表

    在 Mathematica 中我有一个点坐标列表 size 50 points Table RandomInteger 0 size RandomInteger 0 size i 1 n 以及这些点所属的聚类索引列表 clusterIndi
  • 如何在 LINQ 中执行 String.Replace?

    这是我正在尝试做的事情 但没有成功 我想打电话from x in list1 and join y in list2 where regex Match x Value Success 完成这些步骤后我需要打电话String Replace
  • JPA EntityManager createQuery() 与 createNamedQuery() 和 createNativeQuery()

    谁能解释一下 JPA 的以下方法之间的区别实体管理器 createQuery createNamedQuery createNativeQuery 并告诉我在什么情况下我们应该使用哪种方法 创建查询方法用于创建动态查询 这些查询是直接在应用
  • 尽管 JPA Converter 可用,但 org.hibernate.MappingException

    我有一个自己的 Id 类型 public class Id
  • 以特定方式填充列表

    我需要填充一个包含 5 个位置的列表 new list 我收到 2 个列表 并且有一个默认值来填充新列表 现在开始解决问题 好的方式是 我从列表中接收 2 个值 从列表中接收 2 个值并添加默认值 A1 A2 DEFAULT B1 B2 但
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 将 geojson 文件下载到 jupyter 中的 folium 中

    我想要一张欧洲地图 作为 json 文件 这样我就可以使用 geojson 将其作为图层放置在 Folium 地图上 这样我就可以将我的数据集嵌入到其中 以显示欧洲哪个国家的酒精含量最高 我在从 GitHub 获取 json 文件以在 jy
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri
  • 当我在空表上执行 Hibernate saveOrUpdate 时失败

    我尝试使用以下代码插入或更新数据库记录 Category category new Category category setName catName category setId 1L categoryDao saveOrUpdate c
  • 在python中组合2个列表

    我有 2 个列表 每个列表大小相同 并且有兴趣将这两个列表组合起来并将其写入文件中 alist 1 2 3 5 blist 2 3 4 5 结果列表应该是这样的 1 2 2 3 3 4 5 5 之后我希望将其写入文件 我怎样才能做到这一点
  • 可空日期列合并问题

    我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现 我也在使用MySQL数据库 我在更新具有可为空 Date 属性的对象时遇到问题 当我尝试合并 Date 属性设置为 null 的实体时 不会生成 sql
  • Hibernate 序列乘以 50 生成“@Id”?

    private static final String SEQUENCE my seq Id GeneratedValue strategy GenerationType SEQUENCE generator SEQUENCE Sequen
  • python中的列表列表的集合

    我有一个列表列表 mat 1 2 3 4 5 6 1 2 3 7 8 9 4 5 6 我想转换成set即删除重复列表并从中创建一个新列表 其中仅包含unique lists 在上述情况下 所需的答案将是 1 2 3 4 5 6 7 8 9
  • 数学 - 映射数字

    如何将 a 和 b 之间的数字线性映射到 c 和 d 之间 也就是说 我希望 2 到 6 之间的数字映射到 10 到 20 之间的数字 但我需要广义的情况 我的脑子炸了 如果您的数字 X 位于 A 和 B 之间 并且您希望 Y 位于 C 和
  • 使用@Transactional注解批量插入

    在我的 Spring 应用程序中 我想一次性在数据库中插入近 1500 条记录 我在后端使用 Spring 4 X 和普通休眠 在我的服务层中 我使用 Transactional 注释 现在 在某个时间点之后插入记录时 我遇到内存不足错误
  • Hibernate 在使用序列时生成负 id 值

    我有一个具有以下定义的类 Id SequenceGenerator name SEQ ACE WORKERS QUEUE STATS ID sequenceName SEQ ACE WORKERS QUEUE STATS ID alloca
  • 单元测试时静态元模型属性为 null

    我在外部包中有 Entity 类 这些类也有静态元模型 在我的应用程序的服务类中 我使用这些元模型和 EntityManager CriteriaBuilder CriteriaQuery 来检索我的数据 这在运行应用程序时工作得很好 但是
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • 如何在 asmx 文件中添加 WebMethod

    我已经开始在 ASPX Web 项目中工作 该项目已经有一个现有的asmx文件 它包含大约 4 个 WebMethods 这 4 个 Webmethods 显示了http localhost 2133 WebServices asmx 现在
  • 使用 ruby​​ on Rails 向静态网站添加功能

    我是 ruby on Rails 的新手 我有一个包含很多静态页面的网站 我想向网站添加一些动态页面 我将在 ruby on Rails 中开发这些页面 当用户单击静态页面之一上的按钮之一时 将触发这些页面提供的功能 我想我将把动态页面放在
  • 将原始图像数据放在 Src Attr 中是否更有效?

    我最近发现src图像的属性允许您将原始的 Base 64 图像数据直接放入其中 我是否正确地认为这在技术上比单独的图像文件更有效 因为不必对图像提出额外的请求 或者开销太小以至于不值得 另外 假设我最终这样做了 获取原始数据的最佳方法是什么
  • vb.net 的 file.shortpath

    我正在将我的项目从 vb6 转换为 vb net vb net中有shortpath的模拟方法吗 Dim DestinationFile As Scripting File DestinationFile ShortPath Thanks
  • 具有 OneToOne 关系的 Django 模型?

    假设我使用默认值auth models User加上我的习惯Profile and Address模型看起来像这样 class Profile models Model user models OneToOneField User prim
  • 实体框架数据库首次 POCO t4 生成和验证

    注意 我使用的是 ASP Net 应用程序而不是 MVC 因此不支持验证属性 我使用数据库优先方法 然后使用 POCO t4 模板生成 POCO 类 我将生成的 POCO 类移动到它自己的库 Domain Model 中 现在我想使用 En
  • Rails:ActionMailer 的运行时配置?

    我想通过 Gmail 从我的应用程序发送少量电子邮件 现在 SMTP 设置将在运行时确定 即 从数据库 可以这样做吗 编辑 我可以在该类的方法之一中设置 ActionMailer 子类 名为 Notifier smtp 设置 这样我就可以设
  • 对于在 Python3 中的 Tornado 上使用非阻塞 MySQL api 有什么建议吗?

    我希望tornado支持异步sql数据库操作 在我阅读源代码之后 http www tornadoweb org documentation modules tornado database html Connection http www
  • WHOIS 服务器守护进程

    是否有任何 WHOIS 服务器守护程序可以在我的服务器上运行并服务我的请求 是否可以像 DNS 服务器一样在 WHOIS 层次结构的末尾部署自己的 WHOIS 服务器 看一眼rwhois https www rfc editor org r
  • Request.Unvalidated 在 asp.net-core 上在哪里?

    我注意到在classic ASP NET MVC有一个Unvalidated属性于Request它允许访问当前请求提供的原始值 我无法在 ASP NET MVC 上识别此属性Core 还有办法访问该信息吗 ASP NET Core 不具有与
  • 为什么Java需要Serialized接口?

    我们大量地进行序列化工作 并且必须在我们使用的每个对象上指定可序列化标签是一种负担 尤其是当它是我们无法真正更改的第 3 方类时 问题是 由于 Serialized 是一个空接口 一旦添加 Java 就会提供健壮的序列化implements
  • Django:重建通过 $.post 发送的结构化参数

    我正在发送带有结构化发布数据的 Ajax 请求 使用 jQuery post myUrl items code a description aaa code b description bbb 我所看到的request POST is
  • 签名 APK 中的空响应 - 调试 APK 中的正确响应

    我正在使用 Retrofit 进行网络调用 我在签名 APK 时面临奇怪的问题 改造请求 FormUrlEncoded Headers Accept application json POST Call
  • 如何在 VB.NET 中每 x 分钟调用一个函数?

    如何每 x 分钟调用一个函数 我想我必须在表单中添加一个计时器 这是一个简单的例子 Public Class SampleCallEveryXMinute Private WithEvents xTimer as new System Wi
  • 总是在 Perl 脚本结束之前执行一些代码

    如何设置在 Perl 脚本停止之前必须执行的代码 In here 如何在perl脚本退出之前运行一段代码 https stackoverflow com questions 3078508 how to run piece of code
  • 调用app.MainLoop()后更新wxPython进度条

    我有一个执行计算的 python 脚本 并且我已经为弹出 wxPython 进度条创建了一个类 目前我有 app wx App progress ProgressBar app MainLoop for i in xrange len to
  • Android:设置自定义字体时出现异常

    自一小时以来 我一直在绞尽脑汁地从代码中设置自定义字体到文本 我已经在之前的项目中做到了这一点 而且它有效 但我不知道出于什么原因 它给了我例外 无法制作原生字体 在这里 我已经解决了许多与此相关的问题 并尝试了建议的解决方案并适用于这些情
  • 是否可以从我自己的 AoG 应用程序的实现中触发另一个 Actions on Google 应用程序? [复制]

    这个问题在这里已经有答案了 此问题专门与 Google Apps 上的操作有关 涉及触发事件 操作以使助手为最终用户选择另一个 AoG 应用程序的能力 专门用于触发其他人的 AoG 应用程序 而不是您编写的应用程序 Idea 我想创建一个自
  • 轴位于中心的 R 图

    默认情况下 R 中的笛卡尔轴位于图的底部和左侧 如何使轴居中 如下图所示 Example using data generated by bgoldst estimate curve x lt seq 1 1 5 0 1 y lt c 1
  • 使用 Hibernate 映射双向列表

    我不明白映射双向列表时 Hibernate 的行为 Hibernate 生成的 SQL 语句对我来说似乎不是最佳的 有人可以启发我吗 场景如下 我有一对多的父子关系 我用双向列表来映射这种关系 根据Hibernate 注解参考指南 http