当前位置: 首页 > 面试题库 >

没有对象到对象的映射,是否可以强制执行外键?

郑正阳
2023-03-14
问题内容

假设提供了以下映射:

<class name="A" table="a_table">
  <id name="id"/>
  <many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/>
</class>

<class name="B" table="b_table">
  <id name="id"/>
</class>

Java类:

public class A {
   private long id;
   private B entityB;
   // getters and setters skipped
}

是否可以更改Hibernate映射,以便 在启动时仍由Hibernate强制并创建外键 ,但类A如下所示:

public class A {
   private long id;
   private long idOfB;
   // getters and setters skipped
}

我知道,如果我将其转换<many-to-one...为a <property...可以使用,但是数据库不会强制使用外键。

我需要执行此操作,因为对象B可能会(或可能不会)单独初始化,这有时会导致
org.hibernate.LazyInitializationException: could not initialize proxy - no Sessiona.getB()调用时发生异常。我希望将其作为,long idOfB并在必要时加载整个对象。这也将使对象的加载A更快。

我相信我的问题与这一问题非常相似,但是所提供的解决方案(使用延迟加载)不适用于我的情况,即使我打电话给a.getB().getId()LazyInitializationException,但如果我打电话给a.getIdOfB()我就不行。

首先十分感谢。


问题答案:

如前所述

我知道,如果将<many-to-one …转换为<property …,这可以工作, 但是 数据库 不会强制使用外键

所以我的建议是:同时 使用

public class EntityA {

    private Integer idOfB;

    private EntityB entityB;

    // getter's and setter's

}

<class name="A" table="a_table">
    <id name="id"/>
    <property name="idOfB" column="fk_B" not-null="false" unique="true"/>
    <many-to-one name="entityB" update="false" insert="false" column="fk_B"/>
</class>

请注意,当两个属性共享同一列时, 您仅需将其设置放在一个属性中
。否则,Hibernate将抱怨一些错误。它解释了为什么我在entityB属性中定义update =“ false”和insert =“ false”。

问候,



 类似资料:
  • 根据Mapstruct文档,通过为被引用的对象(对象B)定义映射方法,可以将一个对象(对象A)映射到D,该对象包含另一个对象(对象B)。但是如果我只需要映射那个对象(对象B)的属性而不是整个对象呢? 但是如何用Java和MapStruct来实现呢?

  • 在查看几个不同的文档时,我只看到地图(ECMAScript6)键是布尔值、字符串或整数。有没有一种方法可以使用另一个定制的对象(用新的CustomObject(x, y)构造函数调用调用)作为键添加? 我可以添加一个对象作为密钥,但无法检查地图是否有所述对象。 有办法解决这个问题吗? https://developer.mozilla.org/en-US/docs/Web/JavaScript/R

  • 假设我有这样的映射: 现在,我需要将子列表映射到子列表,但它们都有相同的父对象。我希望这样做: 但不管用,有机会做吗?

  • 我有一个对象,我正试图映射到。现在这个有一个名为的枚举,其中包含一些值。我想使用将它们映射到中的其他枚举值。以下是我到目前为止的代码: 当我尝试编译它时,我得到了错误:

  • 问题内容: 我试图使用Java将DO转换为DTO,并在开始编写自己的工具之前寻找自动化工具。我只是想知道是否有可用的免费工具。 问题答案: Dozer是Java Bean到Java Bean的映射器,可将数据从一个对象递归复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。 推土机支持简单的属性映射,复杂的类型映射,双向映射,隐式-显式映射以及递归映射。这包括映射集合属性,这些属性

  • 您好,在boost或std中是否有一个容器,其中键是类型名,值是对象/实例??? 我想要实现的是,对于每种数据类型,我都有一个对象池,当我想要构造那个对象时,我只想通过键获取。我已经有了工作代码,但如果我使用更标准的代码,我会更高兴。 目前我有这样一个代码: 编辑:我想要的是一个COMPILE-TIME映射。你可以想象一个std::元组