2011-03-08 19 views
13

Tôi đang thiết lập một dữ liệu thử nghiệm cơ bản và muốn theo dõi tất cả dữ liệu mà EntityManager xử lý. Thay vì chỉ có một loạt các danh sách cho mỗi thực thể là có một cách để lấy tất cả mọi thứ được quản lý bởi EntityManager trong một ngã swoop?Có cách nào để có được tất cả các thực thể được quản lý từ một EntityManager

Vì vậy, thay vì điều này:

EntityManager em; 
List<Entity1> a; 
List<Entity2> b; 
... 
List<Entityn> n; 

cleanup() { 
    for(Entity1 e : a) em.remove(e); 
    for(Entity2 f : b) em.remove(f); 
    ... 
    for(Entityn z : n) em.remove(z); 
} 

Tôi muốn một cái gì đó như thế này;

EntityManager em; 

cleanup() { 
    List<Object> allEntities = em.getAllManagedEntities(); //<-this doesnt exist 
    for(Object o : allEntities) em.remove(o); 
} 

Không chắc chắn nếu điều này có thể, nhưng tôi sẽ chỉ hình ảnh mà người quản lý biết những gì nó đang quản lý? Hoặc, nếu bạn có bất kỳ ý tưởng quản lý một loạt các thực thể một cách dễ dàng.

Trả lời

20

Tôi nghĩ rằng đây có thể giúp:

for (EntityType<?> entity : entityManager.getMetamodel().getEntities()) { 
    final String className = entity.getName(); 
    log.debug("Trying select * from: " + className); 
    Query q = entityManager.createQuery("from " + className + " c"); 
    q.getResultList().iterator(); 
    log.debug("ok: " + className); 
} 

Về cơ bản EntityManager :: metamodel chứa các thông tin liên quan đến MetaData Entities quản lý.

+3

Dành cho bất cứ ai khác đi ngang qua: Tên biến "className" đã đánh lừa tôi một chút vì nó thực sự là jpaEntityName. Để có được lớp thực tế người ta nên sử dụng getBindableJavaType. @Faisal, cảm ơn đã chỉ cho tôi đúng hướng – Ittai

+3

Tôi không chắc chắn rằng những gì OP yêu cầu. Có vẻ như in tất cả các thực thể có thể được tìm nạp từ cơ sở dữ liệu, nhưng không phải tất cả các thực thể * hiện * được quản lý bởi EntityManager. –

+0

Điều này chỉ đơn giản là sai! Như @MarcusJuniusBrutus đã chỉ ra, điều này tải tất cả các hàng của tất cả các thực thể đã biết từ DB. Khi mã kết thúc, bạn có thể thực sự có được một bàn tay trên tất cả các thực thể nạp. Nhưng đây không phải là các thực thể được quản lý trước khi thực thi mã. – BetaRide

1

Nếu bạn cần xóa tất cả các thực thể được chèn trong khi thử nghiệm, bạn có thể thực hiện kiểm tra bên trong một giao dịch và sau đó quay lại giao dịch đó. Xem 9.3.5.4 Transaction management làm ví dụ về cách tiếp cận này.

4

Nhà cung cấp JPA nào bạn đang sử dụng?

Không có gì trong API JPA cho việc này.

Nếu sử dụng EclipseLink, bạn có thể sử dụng,

em.unwrap(UnitOfWorkImpl.class).getCloneMapping().keySet() 
+0

Và đối với Hibernate, bạn có thể sử dụng https://stackoverflow.com/questions/16460796/hibernate-how-to-get-a-list-of-all-the-objects-currently-in-the-session – Foumpie