Tôi đã gặp một tình huống (mà tôi nghĩ là lạ nhưng có thể là khá bình thường) khi tôi sử dụng EntityManager.getReference (LObj.getClass(), LObj .getId()) để có được một thực thể cơ sở dữ liệu và sau đó vượt qua đối tượng trả về để được tiếp tục tồn tại trong một bảng khác.Khi nào sử dụng EntityManager.find() vs EntityManager.getReference()
Vì vậy, về cơ bản các dòng chảy là như thế này:
class TFacade{ createT(FObj, AObj) { T TObj = new T(); TObj.setF(FObj); TObj.setA(AObj); ... EntityManager.persist(TObj); ... L LObj = A.getL(); FObj.setL(LObj); FFacade.editF(FObj); } } @TransactionAttributeType.REQUIRES_NEW class FFacade{ editF(FObj){ L LObj = FObj.getL(); LObj = EntityManager.getReference(LObj.getClass(), LObj.getId()); ... EntityManager.merge(FObj); ... FLHFacade.create(FObj, LObj); } } @TransactionAttributeType.REQUIRED class FLHFacade{ createFLH(FObj, LObj){ FLH FLHObj = new FLH(); FLHObj.setF(FObj); FLHObj.setL(LObj); .... EntityManager.persist(FLHObj); ... } }
tôi đã nhận được ngoại lệ sau "java.lang.IllegalArgumentException: thực thể Unknown: com.my.persistence.L $$ $$ EnhancerByCGLIB 3e7987d0"
Sau khi xem xét nó một lúc, cuối cùng tôi đã tìm ra rằng đó là vì tôi đã sử dụng phương thức EntityManager.getReference() mà tôi đã nhận được ngoại lệ trên vì phương thức đã trả về proxy.
Điều này khiến tôi tự hỏi, khi nào nên sử dụng phương thức EntityManager.getReference() thay vì phương thức EntityManager.find()?
EntityManager.getReference() ném ra một EntityNotFoundException nếu nó không thể tìm thấy thực thể đang được tìm kiếm mà rất thuận tiện trong chính nó. Phương thức EntityManager.find() chỉ trả về null nếu nó không thể tìm thấy thực thể.
Liên quan đến ranh giới giao dịch, âm thanh với tôi như bạn sẽ cần phải sử dụng phương thức find() trước khi chuyển thực thể mới được tìm thấy sang giao dịch mới. Nếu bạn sử dụng phương thức getReference() thì có thể bạn sẽ kết thúc trong một tình huống tương tự như của tôi với ngoại lệ trên.
Quên đề cập đến, tôi đang sử dụng Hibernate làm nhà cung cấp JPA. – SibzTer