1

次のような関係があります。

    @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
}

記録を適切に保存できます。しかし、請求書オブジェクトを注文オブジェクトに設定して注文オブジェクトを更新しようとすると、注文オブジェクトは永続化されず、請求書オブジェクトだけが永続化されます。

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

コンソールでは、INVOICE_ (DISCOUNT, GRAND_TOTAL, ORDER_ID, ROUNDING, SERVICE_TAX, SUB_TOTAL, SURCHAARGE, VAT) 値 (?, ?, ?, ?, ?, ?, ?, ?) に挿入する 1 つの SQL ステートメントのみを表示できます。

請求書 ID が注文テーブルで更新されていません :(

誰でも問題が何であるかを提案できますか。

前もって感謝します.....

4

2 に答える 2

2

これは、珍しいデザインに依存する場合があります。

ORDR_ の INVOICE_ID と INVOICE_ の ORDER_ID を使用すると、両方のテーブルが同時に互いの親と子になります。

データベースが外部キーを使用している場合、削除と挿入は難しくなります。

1 つのタイプ/テーブルを親として使用し (たとえば、通常は最初に注文するため)、もう 1 つを子として使用する必要があります (order_id は Invoice_ テーブルにあります)。

オブジェクト モデルでは、両方向を持つことができます ( http://docs.oracle.com/javaee/6/api/javax/persistence/OneToOne.htmlの最初の例を参照) 。

于 2013-09-07T18:07:18.817 に答える
1

問題は、エンティティ/テーブルと1 対 1 のマッピング スタイルを使用したシナリオが正しくないことです。1 対 1の概念は、現在のテーブルとエンティティの両方の設計に対応していません。

1 対 1 について詳しくは、こちらをお読みください: 1 対 1 マッピングの概念。マッピングの説明

Hibernate – One-to-One example (Annotation)では、1 対 1 のマッピングの例を見つけることができます。

1 対 1 のマッピングを本当に続けたい場合は、次のことを行う必要があります。

  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;
}

1 対 1 の概念がどのように異なるかを示すために、下書きとして受け取ってください。

于 2013-09-07T18:01:37.787 に答える