2009-07-16 25 views
35

Trong JPA, là có cách nào bạn có thể sao chép Hibernate của saveOrUpdate behavior,Làm thế nào bạn có thể sao lưu của Hibernate saveOrUpdate trong JPA?

saveOrUpdate 

public void saveOrUpdate(Object object) 
        throws HibernateException 

    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking). 

    This operation cascades to associated instances if the association is mapped with cascade="save-update". 

    Parameters: 
     object - a transient or detached instance containing new or updated state 
    Throws: 
     HibernateException 
    See Also: 
     save(Object), update(Object) 

trong đó chủ yếu kiểm tra xem nếu đối tượng đã tồn tại trong cơ sở dữ liệu và một trong hai bản cập nhật mà phản đối nếu thấy cần thiết hoặc tiết kiệm một trường hợp mới của vật.

JPA transcationless lần đọc là tốt đẹp, nhưng tôi thực sự thiếu phương pháp này từ Hibernate. Các nhà phát triển JPA có kinh nghiệm xử lý việc này như thế nào?

+0

Còn việc kiểm tra xem "khóa chính" có bị rỗng không? –

Trả lời

27

Thử sử dụng phương pháp EntityManager.merge - điều này rất giống nhau.

Có một mô tả tuyệt vời về sự khác biệt trong blog của Xebia: "JPA Implementation Patterns: Saving (Detached) Entities".

+6

Việc lấy mất lớn đối với tôi ở đây là "Khi cập nhật thực thể hiện tại, chúng tôi không gọi bất kỳ phương thức EntityManager nào; nhà cung cấp JPA sẽ tự động cập nhật cơ sở dữ liệu lúc xả hoặc cam kết." –

+1

Liên kết đã chết. Đây là cái mới: http://blog.xebia.com/jpa-implementation-patterns-saving-detached-entities/ – Dmitry

5

Sự cố với phương pháp được nêu trong bài viết mà Pablojim liên kết, là nó không xử lý các khóa chính được tạo tự động rất tốt. Hãy xem xét việc tạo một đối tượng thực thể ORM mới, bạn có thể cung cấp dữ liệu giống như một hàng hiện có trong bảng cơ sở dữ liệu, nhưng trừ khi tôi bị nhầm lẫn, người quản lý thực thể không nhận ra chúng như một hàng cho đến khi chúng có cùng một khóa chính, trong một thực thể sử dụng các khóa được tạo tự động, bạn không thể nhận được cho đến khi bạn đi đến cơ sở dữ liệu.

Đây là công việc hiện tại của tôi xung quanh cho tình huống đó;

/** 
* Save an object into the database if it does not exist, else return 
* object that exists in the database. 
* 
* @param query query to find object in the database, should only return 
* one object. 
* @param entity Object to save or update. 
* @return Object in the database, whither it was prior or not. 
*/ 
private Object saveOrUpdate(Query query, Object entity) { 
    final int NO_RESULT = 0; 
    final int RESULT = 1; 

    //should return a list of ONE result, 
    // since the query should be finding unique objects 
    List results = query.getResultList(); 
    switch (results.size()) { 
     case NO_RESULT: 
      em.persist(entity); 
      return entity; 
     case RESULT: 
      return results.get(0); 
     default: 
      throw new NonUniqueResultException("Unexpected query results, " + 
        results.size()); 
    } 
} 
+1

hợp nhất và lưuOrUpdate tương tự về mặt bề ngoài, nhưng không giống nhau. Các ngữ nghĩa có những khác biệt quan trọng. – skaffman

+0

@skaffman, bạn có nghĩ rằng cách tiếp cận của tôi là thiếu sót không? Bạn có thể ném một số lời chỉ trích xây dựng theo cách của tôi nếu nó được. Tôi là một đứa trẻ trong rừng cho công cụ JPA này. –

+0

Chỉ tìm thấy chuỗi cũ này và tôi đang triển khai một cái gì đó giống như giải pháp này ngoại trừ với các ENUMS Java mới. Cảm ơn. – oberger

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