4

私には2つのエンティティ、つまり1対多の関係にある顧客と注文があります。1人の顧客が複数の注文をすることができます。この関係を単方向にする必要があるため、joinTableを使用しています。

JPAを使用して顧客エンティティにエントリを追加できます。JPAを使用して注文エンティティにエントリを追加できます。

2つのデータをどのように接続するのか疑問に思っています。顧客テーブルに1つのエントリがあり、注文テーブルに2つのエントリがあるとします。これらの注文テーブルの2つのエントリを、顧客テーブルの1つのエントリに関連付けたいと思います。

現在、jointablecustomer_orderにエントリが表示されません。どうすれば関連付けを行うことができますか?注文を注文テーブルに追加しているときに、どういうわけか顧客ID番号を記載する必要があると思います。それを行う方法がわからない。JPAにそのための基準クエリはありますか?

ありがとう。

カスタマークラス-

@Entity
public class Customer implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "generatorCustomer")
    @TableGenerator(name = "generatorCustomer", allocationSize = 1)
    @Column(name="customer_id")
    private Long id;
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @OneToMany()
    @JoinTable (
        name="customer_order",
        joinColumns={ @JoinColumn(name="customer_id", referencedColumnName="customer_id") },
        inverseJoinColumns={ @JoinColumn(name="order_id", referencedColumnName="order_id", unique=true) }
    )
    private List<Order> orderList = new ArrayList<Order>();
    public List<Order> getOrderList() {
        if(this.orderList == null) {
            this.orderList = new ArrayList<Order>();
        }
        return this.orderList;
    }

    public void setOrderList(List<Order> orderList) {
        this.orderList = orderList;
    }

    public void addOrder(Order order) {
        this.orderList.add(order);
    }

    /* other logic follows......... */
}

注文クラス-

@Entity
public class Order implements Serializable {
@Id
@GeneratedValue
@Column(name="order_id")
private Long id;
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

/* other logic follows......... */
}

顧客テーブルの説明:

jbossql=# \d customer
Column   |         Type          |                        Modifiers
-------------+-----------------------+---------------------------------------------------------------
customer_id | bigint                | not null default nextval('customer_customer_id_seq'::regclass)
name        | character varying(50) | 
Indexes:
"customer_pkey" PRIMARY KEY, btree (customer_id)
Referenced by:
TABLE "customer_order" CONSTRAINT "fk8ef2f420ec016855" FOREIGN KEY (customer_id) REFERENCES customer(customer_id)

注文表の説明:

jbossql=# \d order
Column   |  Type  | Modifiers 
------------+--------+-----------
order_id   | bigint | not null
value      | real   | 
Indexes:
"order_pkey" PRIMARY KEY, btree (order_id)
Referenced by:
TABLE "customer_order" CONSTRAINT "fk1e4828a98187660" FOREIGN KEY (order_id) REFERENCES order(order_id)

customer_order共同テーブルの説明:

jbossql=# \d customer_order
Column       |  Type  | Modifiers 
--------------+--------+-----------
customer_id  | bigint | not null
order_id     | bigint | not null
Indexes:
"customer_order_order_id_key" UNIQUE CONSTRAINT, btree (order_id)
Foreign-key constraints:
"fk1e4828a98187660" FOREIGN KEY (order_id) REFERENCES order(order_id)
"fk1e4828adba386b8" FOREIGN KEY (customer_id) REFERENCES customer(customer_id)

顧客テーブルにアイテムを挿入できます。

jbossql=# select * from customer;
customer_id | name 
-------------+-------------
1        | joe
(1 row)

オーダーテーブルにもアイテムを挿入できます。

jbossql=# select * from order;
order_id | value 
----------+-----------
1       |  1.8
2       |  0.5
(2 rows)

私はcustomer_orderテーブルが自動的に入力される、つまり休止状態がそれを引き受けるだろうと思っていました。しかし、私のジョイント可能ファイルが空であるためではないようです。

jbossql=# select * from customer_order;
customer_id | order_id 
-------------+-----------
(0 rows)

したがって、私の意図は、これら2つの注文エントリをcustomerjoeに接続することです。

助けてください。

  1. customer_orderテーブルにレコードを明示的に追加する必要がありますか?
  2. そうでない場合、そのエントリを特定の顧客に接続できるように、注文テーブルにアイテムを挿入するにはどうすればよいですか?
  3. このOneToMany[単方向]関係が期待どおりに機能するように、Javaファイルでのマッピングは正しいですか?
  4. JPA2とJBossおよびHibernateを使用しています。1対多の関係をテストするためのコード参照はありますか?完全なプロジェクトまたは資料を読むための参照が役立ちます。

見てくれてありがとう。

4

2 に答える 2

1

それは非常に簡単です:

customer.addOrder(order);

必要なのはそれだけです。それがORMの原則です。オブジェクトを操作すると、ORMは、定義したマッピングを使用してオブジェクトをデータベースに保存します。

于 2013-03-15T20:09:24.017 に答える
1

カスケード属性を@OneToManyアノテーションに追加する必要があります。 @OneToMany(cascade=CascadeType.ALL)

カスケードで使用できるすべてのタイプの操作をここで確認できます:http: //docs.oracle.com/javaee/6/api/javax/persistence/CascadeType.html

そして、ここでカスケード属性の詳細を読むことができます:http: //docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html

customer_orderに明示的に挿入する必要はありません。

于 2013-04-11T13:55:50.060 に答える