2012-09-01 41 views
0

我有兩個實體客戶和訂單(瑣碎的getter和setter方法除外)高效JPQL:在@OneToMany更新實體

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

現在我需要設置「支付=真」給定客戶的所有訂單 下面的查詢似乎做的伎倆,但我覺得它是無效的,事實上,我存儲在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) 

我正在使用容器管理的事務,glassfish和javaDb。但我更喜歡如果可以在JPA/JPQL域進行改進,而不是特定於容器或數據庫。

回答

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然後true將被保存到DB

+0

新增數據類型。 –

+0

我已經考慮過這個選項,但我認爲使用jpql進行批量更新會更快,因爲它不需要構造Java實體。 –

+0

什麼類型的字段在數據庫中「付費」? – Ilya