2012-05-16 18 views
5

Tôi đang sử dụng spring 3.0.6, jpa 2.0, hibernate 3.6.8. Câu hỏi của tôi là, trong đó tình huống là javassist được sử dụng để tạo "proxy" cho EntityClass? Và lý do của proxy này là gì? Tôi có Entity sau:Khi nào các Lớp học thực thể được nâng cao và làm gì? jpa, spring, hibernate, javassist

@Entity 
public MyEntity{ 
.. 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "adresseID") 
    private Adresse adresse; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "myEntity") 
    private List<Parameter> parameters; 

.. 
} 

Khi tôi tải một MyEntity từ db, lớp thực thể là một cái gì đó giống như MyEntity __ $$ _ Javassist. Tại sao nó được thực hiện? Để làm gì? Tôi nghĩ rằng chỉ MyEntity hạng bình thường có thể được sử dụng ở đây.

Để thực hiện tải lười biếng, chúng ta có thể:

  • cho @OneToMany - PersistenceBag có thể được sử dụng ở đây
  • cho @ManyToOne - đây nên được sử dụng "enchancedClass" như Adress_ $$ _javassist

Vì vậy, lý do để enchancing MyEntity là gì? Tôi có thể đọc thêm điều gì về nó? Bạn có thể giới thiệu sách/bài viết/blog nào cho tôi?

Trả lời

4

Lý do chính tại sao các lớp thực thể được tăng cường là JPA (hoặc Hibernate) cần theo dõi trạng thái đối tượng thực thể. Trong JPA cụ thể phải biết nếu trường thực thể là "bẩn" - nó đã được sửa đổi bởi người dùng, nhưng thay đổi này chưa được phản ánh trong cơ sở dữ liệu, vì vậy JPA phải đồng bộ hóa nó với cơ sở dữ liệu khi giao dịch được cam kết.

Trường hợp còn lại là trạng thái "được tải" của trường đối tượng. Bất kỳ trường nào cũng có thể được chỉ định để tải xuống. Khi trường như vậy sắp được sử dụng, JPA phải biết rằng truy vấn cơ sở dữ liệu phải được thực hiện để khởi tạo giá trị của trường đó.

Mặc định của Hibernate là sử dụng tăng cường thời gian chạy - proxy chỉ là lớp con của thực thể có thêm nội dung bổ sung.

Một số ý tưởng chung được phác thảo here.