0

Customer と Order の 2 つのエンティティがあります (自明なセッターとゲッターは除外されます)。

@Entity
public class Customer {

    @GeneratedValue
    @Id
    private int id;

    @OneToMany
    List<Order> orderList;


}

@Entity
public class Order {

    @GeneratedValue
    @Id
    private int id;

    @ManyToOne
    Customer customer;

    private boolean paid;

    public Order(Customer customer) {

        this.customer = customer;
        customer.getOrderList().add(this)
    }   
}

今、私は特定の顧客のすべての注文に対して 'paid = true' を設定したい以下のクエリはトリックを行うようですが、非効率的であると感じ、逆の関係を Customer.orderList に保存したという事実はそこにあることを示唆していますこれを行うには他の方法があるはずです。

UPDATE Order o SET o.paid = true WHERE EXISTS 
(SELECT c.orderList FROM Customer c WHERE o MEMBER OF c.orderList AND c = :customer)

コンテナー管理トランザクション、グラスフィッシュ、および JavaDb を使用しています。しかし、コンテナーやデータベースに固有のものではなく、JPA/JPQL ドメインで改善を行うことができればと思います。

4

1 に答える 1

1

private id;?? 欠落したフィールド タイプ

@OneToMany注釈に追加、cascade = CascadeType.All

Customer entity = entityManager.find(Customer.class, id)   
for (Order order : entity.getOrderList())  
{
   order.setPaid(true);  
}  

cantainer managed transaction使用している場合はtrueDBに保存されます

于 2012-09-01T10:51:12.277 に答える