【问题标题】:Problem with parent/child relation with hibernate与休眠的父/子关系问题
【发布时间】:2011-03-16 08:48:00
【问题描述】:

我遇到了父子类型关系的问题。
Hibernate 文档说要在子类中添加“多对一”关系以从父类获取外键的值。但是为了使这种关系起作用,我必须在子类中添加 Invoice 属性,将父类循环包含到子类中并破坏我的序列化程序。有人能指出我在哪里做错了吗?

这是我的代码:

Invoice.java

public class Invoice implements Serializable {
  private Long id;
  private Date invDate;
  private String customer;
  private Set<InvoiceItem> items;
  ... getters/setters ...
}

InvoiceItem.java

public class InvoiceItem implements Serializable {
  private Long itemId;
  private long productId;
  private int quantity;
  private double price;
  private Invoice invoice; //???????
  ... getters/setters ...
}

发票.hbm.xml

<class name="Invoice" table="Invoices">
  <id name="id" column="ID" type="long">
    <generator class="native" />
  </id>
  <property name="invDate" type="timestamp" />
  <property name="customer" type="string" />

  <set name="items" inverse="true" cascade="all-delete-orphan">
    <key column="invoiceId" />
    <one-to-many class="InvoiceItem" />
  </set>
</class>

InvoiceItem.hbm.xml

<class name="InvoiceItem" table="InvoiceItems">
  <id name="itemId" type="long" column="id">
    <generator class="native" />
  </id>

  <property name="productId" type="long" />
  <property name="quantity" type="int" />
  <property name="price" type="double" />

<many-to-one name="invoiceId" class="Invoice" not-null="true"/> <!--????????-->
</class>

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果您删除 inverse="true" 属性,您不必在 InvoiceItem 中引用 Invoice。 然后 Hibernate 将创建一个单独的映射表,而不是在 InvoiceItem 表中使用外键。

    删除 InvoiceItem 集上的 inverse 属性,同时删除 InvoiceItem 中的 Invoice 属性,以及映射中对应的 many-to-one,你应该会得到你想要的。

    或者,您可以将 InvoiceItem 中的 Invoice 引用标记为瞬态,并在反序列化期间处理填充值:迭代 Invoice 中的项目集,并将每个项目的 invoice 属性设置为拥有发票。

    【讨论】:

    • 我尝试了第一个选项,但出现错误:“字段 'invoiceId' 没有默认值”。 (顺便说一句,数据库中的外键不是空的,我不想让它可以为空)。这里休眠文档建议在我试图避免的子类中添加多对一关系
    • 忘了说,在 Invoice 的 下的 元素中添加 not-null="true"。
    • 太棒了。两种方法都有效。他们中的任何一个都比另一个更受欢迎吗?
    • 使用单向映射(没有从子级到父级的引用)有时更简单,因为您不必担心一致性,但最好取决于您是否需要子级->是否有父参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多