2011-06-28 22 views
0

私は問題を解決しようとしていましたが、今は固執しています。
私は2つのエンティティクラス/テーブルOrderとOrderItemを持っています。 OrderItemにはOrderが1つあり、Orderには1 .. * OrderItemがあります。私のEJBが正常に動作します回避策/ OneToManyとManyToOneの関係で複数の書き込み可能なマッピングを削除しますか?

、それは順番を追加し、そのIDを取得し、それですべてが、必要に応じて注文IDが注文項目行にも挿入され、正常に動作します

Order1 order = addOrder(project, name); 
em.flush(); 
int orderId = order.getOrder(); 
addOrderItem(orderId, cart); 

ためのアイテムを追加します。

しかし、私は多くのマップされたエンティティ、OrderとOrderItemを含むJPQLを実行したいと思います。クエリを実行することがわかっているので、まずエンティティをマッピングする必要があるため、問題は私のマッピングにあります。
ここでは、私はコンパイル時例外を取得

Exception Description: Multiple writable mappings exist for the field [order_item.order_]. Only one may be defined as writable, all others must be specified read-only.

が、私はGoogleで検索し、私は確認する必要があることを発見しましマッピングマッピングのこの種の

public class Order1 implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "order_") 
    private Integer order; 
... 
    @OneToMany(mappedBy="orders",targetEntity=OrderItem.class, 
    fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<OrderItem> orderItems; 
... 
} 

public class OrderItem implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "order_item") 
    private Integer orderItem; 
    @Column(name = "order_" /*, insertable=false, updatable=false*/) 
    private BigInteger order; 
... 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="order_") 
    private Order1 orders; 
... 
} 

ですOrderItemのorder列は書き込み不可能です。あなたがコードで見ることができるように、私はそれを行ってコンパイルしますが、私は自分のアプリケーションで注文すると、order_itemの注文列に注文IDは挿入されておらず、NULLです。しかし、私はそれを残すことはできません、order_itemに順序参照が必要です。

私のJPQLクエリはcreateQuery("SELECT o.order FROM OrderItem oi JOIN oi.orders o"); です。これはorder_itemテーブルのorderカラムを挿入不可能にするときに機能しますが、そのようにすることはできません。提案は何ですか?私のマッピングで何が問題なのですか?order_itemにorder_を挿入することができないのはなぜですか?


@totoの答えについての更新

私のエンティティはNetbeansのウィザードによって生成されました。 BigInteger orderOrderItemに定義しないと、をorder_itemの表に挿入できませんでした。

私のEJBメソッドは以下の通りです

public Order1 addOrder(BigInteger project, BigInteger name) { 

    Order1 order = new Order1(); 
... 
    em.persist(order); 
    return order; 
} 

private void addOrderItem(int orderId, ProjectCart cart) { 

    // convert orderId int to BigInteger 
    BigInteger oId = new BigInteger(String.valueOf(orderId)); 
    OrderItem orderItem = new OrderItem(); 
    orderItem.setOrder(oId); 
.... 
    em.persist(orderItem); 
} 

を私はOrderItemしません内部でorder1ためOrderItem

@Column(name = "order_") 
private BigInteger order1; 

私のゲッターとセッターから除外するのであれば、これは意味仕事と私はorderItem.setOrder(oId)のでできません0メソッドは単にorder1OrderItemに定義されていない原因となります。他のことは、私は私のdatamodelに外部キーを持っていないが、私はそれが関心事ではないと思う。

答えて

1

orderBigInteger orderという名前をOrderItemに定義してはなりません。 JPAによって自動的に(バックグラウンドで)実行されます。JPAによってすでに作成された列を作成しているため、コンパイラは不平を言っています。

+0

こんにちは、私は自分の投稿で更新しました。私は 'OrderItem'で' order'を省略できないので、 'order_item'テーブルにsetterメソッドを設定することができません。 – Skyzer

+0

@Skyzer私はsetterメソッドを持っているべきではないと思っています。新しいアイテムをマップされたorderのリストに追加するだけです: 'order1.orderItems.add(...)'。 ORMと手作業のデータベース管理を混在させているように見えますが、これは唯一の矛盾です。純粋なORMに固執してみてください。 – toto2

関連する問題