2010-02-05 28 views
5

Trong mã của tôi, tôi đã như sau:Spring + JPA + Hibernate: persist đang cập nhật thực thể một cách đáng ngạc nhiên. Hãy đi qua các chi tiết

  • truy vấn cho một tổ chức quá trình
  • cư nó với các dữ liệu quá trình nhất định.
  • courseDao.update (thực thể) trong đó gọi nội bộ là phương thức tồn tại (thực thể).
  • Đáng ngạc nhiên, dữ liệu đã được cập nhật thành công.

Tôi nhầm lẫn với hành vi này của phương pháp kiên trì.

Hãy giúp tôi.

mã như dưới đây:

//My Service...... 
@Service("myService") 
@Transactional 
public class MyServiceImpl implements MyService { 

    @Transactional(rollbackFor = { Throwable.class }) 
    public void updateCourse(final Course course) throws MyServiceException { 
    ------ 
    ------ 
    CourseEntity courseEntity = courseDao.findById(course.getId()); 
    populateCourseEntity(courseEntity, course); 

    courseDao.update(courseEntity); 
    } 
} 

//CourseDao..... 

public class CourseDaoImpl implements CourseDao { 
    -------- 
    public void update(final T entity) throws MyDaoException { 
     if (entity != null) { 
      this.entityManager.persist(entity); 
     } 
     else { 
      String errMsg = "Object to be updated cannot be null."; 
      throw new MyDaoException(errMsg); 
     } 
    } 
} 

Trả lời

7

Khi một tổ chức hiện đang quản lý (gắn liền với một phiên), tất cả các bản cập nhật cho nó được phản ánh trực tiếp đến việc lưu trữ cơ bản ngay cả khi không gọi persist().

Trong trường hợp của bạn, bạn tải thực thể của bạn, vì vậy nó trong phiên. Sau đó, ngay cả khi bạn không gọi persist() nó sẽ được cập nhật trong cơ sở dữ liệu về giao dịch cam kết.

Các persist() mô tả từ javadoc:

Làm một ví dụ thực thể quản lý và dai dẳng.

Điều này có nghĩa là phương pháp không làm bất kỳ điều gì trong trường hợp của bạn, vì thực thể của bạn vừa bền bỉ vừa được quản lý.

P.S. Khi tôi nói "phiên", hãy hiểu "người quản lý thực thể"

+0

Hi Bozho, Cảm ơn bạn đã phản hồi. Nhưng tôi có một câu hỏi ở đây. Trong trường hợp của tôi, thực thể được quản lý, thì việc sử dụng lưu giữ/hợp nhất là gì trong kịch bản là "người quản lý thực thể" sẽ tự động cập nhật các thay đổi trên cam kết. Cảm ơn, Srihari – Srihari

+0

không sử dụng. nó không được yêu cầu. cuộc gọi không có gì. – Bozho

1

JPA cố gắng hết sức để trở thành một API hữu ích, như vậy bất kỳ thứ gì bạn nhận được từ nó (hoặc lưu vào nó) sẽ được theo dõi bởi JPA. Điều này có nghĩa là bất kỳ thay đổi nào khác sẽ được JPA xử lý tự động mà không có bất kỳ công việc bổ sung nào của bạn.

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