1

I have relation as shown bellow:

    @Entity
@Table(name = "ORDER_", catalog = "smartorder")
public class Order implements Serializable {

    /**
     * serial version id
     */
    private static final long serialVersionUID = 13875615L;

    @Id
    @Column(name = "ORDER_ID", unique = true, nullable = false)
    @SequenceGenerator(name = "ORDER_ID_GEN", sequenceName = "ORDER_ID_SEQ")
    @GeneratedValue(generator = "ORDER_ID_GEN")
    private long orderId;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "INVOICE_ID", referencedColumnName = "INVOICE_ID")
    private Invoice invoice;

    // setters and getters
}





@Entity
@Table(name = "INVOICE_")
public class Invoice implements Serializable {
    /**
     * serial version id
     */
    private static final long serialVersionUID = 13875612L;

    @Id
    @Column(name = "INVOICE_ID", unique = true, nullable = false)
    @SequenceGenerator(name = "INVOICE_ID_GEN", sequenceName = "INVOICE_ID_SEQ")
    @GeneratedValue(generator = "INVOICE_ID_GEN")
    private int invoiceId;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "ORDER_ID", referencedColumnName = "ORDER_ID")
    private Order order;

    @Column(name = "SUB_TOTAL", precision = 6, nullable = false)
    private double subTotal;

    @Column(name = "SERVICE_TAX", precision = 6, nullable = false)
    private double serviceTax;

    @Column(name = "VAT", precision = 6, nullable = false)
    private double vat;

    @Column(name = "SURCHAARGE", precision = 6, nullable = false)
    private double surChaarge;

    @Column(name = "GRAND_TOTAL", precision = 6, nullable = false)
    private double grandTotal;


    //setters and getters
}

I am able to save the records properly. But when i am trying to update orders objects by setting invoice object to order object then the order object is nor persisting only invoice object is persisting.

Order o = getSession().load(Order.class,1L);
o.setInvoice(new Invoice(.........));
getSession().update(o);

in console I am able to see one SQL statement only, insert into INVOICE_ (DISCOUNT, GRAND_TOTAL, ORDER_ID, ROUNDING, SERVICE_TAX, SUB_TOTAL, SURCHAARGE, VAT) values (?, ?, ?, ?, ?, ?, ?, ?)

Invoice Id is not getting update in Order table :(

Can anyone suggest whats the issue is.

Thanks in advance.....

4

2 回答 2

2

这可能取决于您不寻常的设计。

使用 ORDR_ 中的 INVOICE_ID 和 INVOICE_ 中的 ORDER_ID,您可以同时拥有两个表作为彼此的父级和子级。

如果您的数据库使用外键,则删除和插入将很困难。

您应该使用一种类型/表作为父类(例如订单,因为它通常是第一个),另一种作为子类(order_id 将在 invoice_ 表中)。

在您的对象模型中,您可以有两个方向(参见http://docs.oracle.com/javaee/6/api/javax/persistence/OneToOne.html的第一个示例)

于 2013-09-07T18:07:18.817 回答
1

问题是您使用实体/表和一对一映射样式的不正确场景。一对一的概念与您当前对表和实体的设计不对应。

请尝试在此处阅读有关一对一的更多信息:一对一映射的概念。解释映射

并且主要在这里深入了解:Hibernate – 一对一示例(注释),您可以在其中找到一对一映射的示例。

如果您真的想继续进行一对一映射,您必须:

  1. 从“INVOICE_”表中删除“INVOICE_ID”列(令人惊讶但事实如此)
  2. 将“INVOICE_”表中的“ORDER_ID”列作为主键(另一个事实)
  3. 将 Invoice 实体的映射更改为更加顺从(由 Order 实体驱动)

发票映射更改示例:

// just a draft, to give you idea about the 
// "submissive" side mapping.
// All the ID stuff of the Invoice is driven by its 
// "Master" - Order
@GenericGenerator(name = "generator", strategy = "foreign", 
parameters = @Parameter(name = "property", value = "order"))
@Id
@GeneratedValue(generator = "generator")
@Column(name = "ORDER_ID", unique = true, nullable = false)
public Integer getOrderId() {
    return this.orderId;
}

public void setOrderId(Integer orderId) {
    this.orderId = orderId;
}

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Order getOrder() {
    return this.order;
}

请把它当作一个草稿来展示一对一的概念有多么不同。

于 2013-09-07T18:01:37.787 回答