2012-07-18 32 views
20

Liệu loại bỏ (thực thể Object) phương pháp EntityManager làm việc chỉ trên các đối tượng nhận được từ tìm() phương pháp?javax.persistence.Entitymanager: loại bỏ phương pháp()

Tôi có đoạn mã sau:

public void deletePerson() { 
    EntityManager em = getEntityManager(); 
    Person p = new Person("x", "y", 200); 
    em.remove(p); 
} 

Nhưng nó không phải là loại bỏ các mục cụ thể từ cơ sở dữ liệu.

Khi tôi đã cố gắng một cái gì đó như dưới đây:

public void deletePerson() { 
    EntityManager em = getEntityManager(); 
    Person p = em.find(Person.class, 200); 
    em.remove(p); 
} 

Nó làm việc tốt.

Trả lời

24

Trích dẫn từ thủ công ObjectDB về deleting JPA entity objects:

Để xóa một đối tượng khỏi cơ sở dữ liệu trước tiên nó phải là được truy xuất (không có vấn đề gì) và sau đó trong một giao dịch đang hoạt động, nó có thể bị xóa bằng cách sử dụng phương pháp xóa này .

An IllegalArgumentException được ném bằng cách loại bỏ nếu đối số không phải là một thể hiện của một lớp thực thể hoặc nếu nó là một thực thể tách rời.

Khi tạo đối tượng với toán tử new, nó sẽ trở thành thực thể tách rời, bạn cần duy trì nó nếu bạn muốn xóa nó.

Khi truy xuất thực thể, bạn đang truy xuất thực thể liên tục.

+0

Với tuyên bố trên, là em.remove (em.merge (người)) - nơi người đã được lấy từ cơ sở dữ liệu - một cách chính xác để xóa đối tượng ? – dendini

+0

@dendini Không, nếu 'người' đã được lấy ra từ cơ sở dữ liệu, thì nó có nghĩa là nó tồn tại trong cơ sở dữ liệu. Vì vậy, trong trường hợp này, bạn có thể gọi trực tiếp 'em.remove (người)'. –

+3

Vì vậy, bạn cần CHỌN rồi XÓA mà là 2 truy vấn trong khi bạn có thể làm điều đó trong một DELETE bản địa duy nhất. Tại sao dư thừa khi nói đến JPA? – sura2k

13

Thứ gì đó theo hướng đó. EntityManager.remove chỉ hoạt động cho các thực thể được quản lý. Làm thế nào bạn có được những thực thể quản lý không quan trọng, nó có thể được ví dụ:

  • qua JPQL truy vấn
  • qua Tiêu chuẩn truy vấn API
  • tìm phương pháp trong EntityManager
  • bằng cách làm theo mối quan hệ từ một số tổ chức khác.
  • tạo tổ chức mới và vẫn kiên trì nó

Nhưng chỉ đơn giản là tạo ra đối tượng mới và cố gắng loại bỏ nó không hoạt động, vì đối tượng mới này không được quản lý thực thể. Ngoài ra thực thể không nên được tách ra.

Cuộc sống của thực thể là khá nhiều như sau, tất cả trong cùng một giao dịch (thực thể bên ngoài giao dịch của họ không được quản lý):

Entity ent = new Entity(1); //entity is in new state, EntityManager never know 
          //anything about it 
em.persist(ent); //entity is managed as long as not disconnected 
       //from EntityManager 
em.clear(); // all previously managed entities, including ent, are now detached 

Entity same = em.find(1); //managed same 
em.remove(same); // entity is removed 
+0

Cảm ơn ví dụ. Bây giờ tôi có ý tưởng về thực thể tách rời. Vẫn nghĩ rằng nó nên ném một số ngoại lệ nói rằng "thực thể không hiện diện hoặc một cái gì đó" – sachinpkale

3

Có trong trường hợp hợp nhất hoặc loại bỏ thao tác, bạn phải sử dụng thao tác tìm hoặc tìm kiếm và sau đó sử dụng phương thức xóa trên thực thể được truy xuất.

Các vấn đề liên quan