Java 有没有一种方法可以在hibernate中不加载父对象而将父对象链接到子对象?
问题是选择几个父实体并将它们与相应的子实体链接。对于此类任务,根本不应加载父项(例如,仅加载ID集合)或加载惰性字段Java 有没有一种方法可以在hibernate中不加载父对象而将父对象链接到子对象?,java,hibernate,parent,Java,Hibernate,Parent,问题是选择几个父实体并将它们与相应的子实体链接。对于此类任务,根本不应加载父项(例如,仅加载ID集合)或加载惰性字段 是否有API(变通方法)通过其ID链接2个实体?例如,不加载父项并调用setChild 是否有一种方法可以将所有惰性字段加载到parent,即使其中一些字段定义为eager?正如我搜索到的,hibernate支持覆盖加载类型。例如,可以编写只加载选定字段的标准。但这并不是一种舒适的方式,因为新的实体类可以使用eager类型添加 我可以加载一个具有相同子级的投影,将子级设置为它,然
setChild
标准
。但这并不是一种舒适的方式,因为新的实体类可以使用eager类型添加如果您有父id,并且子项通过外键与父项关联,则可以使用假父项
Parent parent = new Parent();
parent.setId(parentId);
child.setParent(parent);
// save child
如果要加载具有惰性字段的父级,则应使所有父级字段变为惰性字段,并使用
join fetch
获取它们,或通过单独的请求进行加载。如果您不使用加载的父对象来保存数据(例如,您可以在用户编辑数据后使用相同的id构造新的父对象),则可以使用自定义转换器的部分对象加载,如前所述。我希望这对您有所帮助
如果您已经映射了子模型类和父模型类,并且类似地在hibernate mapping xml文件中映射了这样一种方式,即无需加载父对象,就可以保存子对象,那么您肯定可以完成任务
以下是您的示例代码:-
父类(模型)
子类(模型)
休眠映射文件
<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>
Session.load()/EntityManager.getReference()。请用自我解释的示例编写完整答案好吗?如果不保存子级,则父级将引发外键异常,因为子级引用了不存在的父级行。
private Integer childID;
private String childName;
private Parent parentDetails;
.. getters and setters ..
<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();