【问题标题】:How to save only subclass related data in Hibernate如何在 Hibernate 中仅保存子类相关数据
【发布时间】:2014-06-29 00:20:33
【问题描述】:

我有以下课程

  1. 具体类Item

    @Entity
    @Table(name = "ITEM")
    @Inheritance(strategy= InheritanceType.JOINED)
    Class Item implements Serializable {        
      private static final long serialVersionUID = 1L;
      @Id
      @Column(name = "NAME")
      private final String name;
      @Column(name = "PRICE")
      private BigDecimal price;
    }
    
  2. 扩展Item的具体类AddedItem

    @Entity
    @Table(name = "ADDED_ITEM")
    @PrimaryKeyJoinColumn(name = "NAME")
    public class AddedItem extends Item {
       @Column(name = "TOTAL_PRICE")
       private BigDecimal totalPrice;
       @Column(name = "QUANTITY")
       private Integer quantity;
       @ManyToOne
       @JoinColumn(name = "INVOICE_ID")
       private Invoice invoice;
     }
    
  3. Invoice 类与 AdditionalItem 具有一对多映射

    @Entity
    @Table(name = "INVOICE"
    public class Invoice implements Serializable {
    
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column(name = "INVOICE_ID")
      private Long billNo;
      @Column(name = "BILLDATE")
      @Temporal(TemporalType.TIMESTAMP)
      private Date billDate;
      @Column(name = "CUSTOMERNAME")
      private String customerName;
      @OneToMany(fetch = FetchType.LAZY, mappedBy = "invoice", cascade = CascadeType.ALL)
      private final List<AddedItem> itemsAdded;
    }
    

当我尝试保存 Invoice 实例时,出现以下异常:

org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ORA-00001: unique constraint (ITEM_PK) violated

org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch      update
...

当我预取 Item 相关信息时,如何告诉 Hibernate 只存储子类信息?

【问题讨论】:

    标签: hibernate persistence


    【解决方案1】:

    @Inheritance(strategy= InheritanceType.JOINED) 中你必须定义一个@DiscriminatorColumn 来确定行的类别。添加这个应该可以解决问题。如果您使用的是 Hibernate 3.1 或更低版本(希望您不是),@DiscriminatorFormula 应该可以完成这项工作,但我从未真正亲自尝试过。

    接下来在您的AddedItem 实体上,@PrimaryKeyJoinColumn(name = "NAME") (javadoc, stackoverflow 几乎只是为了展示,但它不应该造成任何伤害。

    如果AddedItem 是公开的,那么Item 实体也应该公开。

    编辑:由于您的 ID 字段是一个字符串,您确定您使用的是正确的唯一值吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2019-12-20
      • 2022-01-13
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多