有没有办法将父与子连接而不在hibernate中加载父?

时间:2015-12-26 15:03:23

标签: java hibernate parent

问题是选择几个父实体并将它们与相应的子项链接起来。对于这样的任务,父母不应该被加载(例如只有id的集合)或者加载了懒惰的字段。

  1. 是否有API(变通方法)通过其ID链接2个实体?例如。无需加载父级并致电.timeZone
  2. 有没有办法加载所有惰性字段的父级,即使其中一些被定义为渴望?正如我所搜索的那样,hibernate支持覆盖加载类型。例如。可以编写只加载选定字段的.dateFromString(...)。但这不是一种舒适的方式,因为新的实体类可以添加急切的类型。
  3. 我可以加载具有相同子项的投影,将子项设置为它,然后像实体类一样持久化吗?

2 个答案:

答案 0 :(得分:3)

如果您有父ID并且某个孩子通过外键与父母有关联,则您可以使用假父母

Parent parent = new Parent();
parent.setId(parentId);
child.setParent(parent);
// save child

如果要加载具有惰性字段的父级,则应使所有父级字段变为惰性,并使用join fetch获取它们,或者通过单独的请求加载。如果您不使用加载的父项来保存数据(例如,您可以在用户编辑数据后构建具有相同ID的新父项),则可以使用部分对象加载自定义转换器,如here所述。

答案 1 :(得分:0)

我希望这会对你有所帮助。

如果您已经映射子模型类并且类似地在 hibernate mapping xml 文件中,以便在不加载父项的情况下,可以保存子对象,则绝对可以完成你的任务。

以下是您的示例代码: -

父类(模型)

 private Integer parentID;
 private String parentName;
 private Child childDetails;

..  getters and setters  ..

儿童类(模特)

private Integer childID;
private String childName;
private Parent parentDetails;

..  getters and setters  ..

Hibernate映射文件

<class name="Model.Parent" table="Parent">
  <id name="parentID" type="integer">
      <generator class="increment"></generator>
  </id>
  <property column="parentName" name="parentName" type="string"/>
  <one-to-one class="Model.Child" name="childDetails" />
</class>

<class name="Model.Child" table="Child">
  <id name="childID" type="integer">
      <generator class="increment"></generator>
  </id>
  <property column="childName" name="childName" type="string"/>
  <many-to-one class="Model.Parent" column="parentID" name="parentDetails" unique="false" not-null="true" lazy="false"/>
</class>

如何在不保存父母的情况下拯救孩子

SessionFactory sf = HibernateUtil.getSessionFactory();
org.hibernate.Session ss = sf.openSession();
Transaction tx = ss.beginTransaction();
Parent p = new Parent();
Child c = new Child();
c.setChildName("XYZ");
c.setParentDetails(p);
ss.save(c);
tx.commit();
ss.close();