Java 有没有一种方法可以在hibernate中不加载父对象而将父对象链接到子对象?

Java 有没有一种方法可以在hibernate中不加载父对象而将父对象链接到子对象?,java,hibernate,parent,Java,Hibernate,Parent,问题是选择几个父实体并将它们与相应的子实体链接。对于此类任务,根本不应加载父项(例如,仅加载ID集合)或加载惰性字段 是否有API(变通方法)通过其ID链接2个实体?例如,不加载父项并调用setChild 是否有一种方法可以将所有惰性字段加载到parent,即使其中一些字段定义为eager?正如我搜索到的,hibernate支持覆盖加载类型。例如,可以编写只加载选定字段的标准。但这并不是一种舒适的方式,因为新的实体类可以使用eager类型添加 我可以加载一个具有相同子级的投影,将子级设置为它,然

问题是选择几个父实体并将它们与相应的子实体链接。对于此类任务,根本不应加载父项(例如,仅加载ID集合)或加载惰性字段

  • 是否有API(变通方法)通过其ID链接2个实体?例如,不加载父项并调用
    setChild
  • 是否有一种方法可以将所有惰性字段加载到parent,即使其中一些字段定义为eager?正如我搜索到的,hibernate支持覆盖加载类型。例如,可以编写只加载选定字段的
    标准
    。但这并不是一种舒适的方式,因为新的实体类可以使用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();