2010-06-11 33 views
7

Tôi đang sử dụng chú thích ngủ đông. Cách thêm phương thức vào đối tượng POJO? Ví dụ tôi có phương thức "getChildNodes", được liên kết với cơ sở dữ liệu, nhưng tôi cũng muốn thêm phương thức đệ quy "getAllChildNodes". Tôi nhận được "org.hibernate.PropertyNotFoundException: Không thể tìm thấy một setter cho tiến trình bất động sản trong lớp" ngoại lệ khi tôi làm điều đó.Chú thích Java, Hibernate, Cách thêm phương thức vào đối tượng POJO?

+0

hiển thị mã của bạn. – Bozho

Trả lời

9

Nếu tôi hiểu nó là "làm thế nào để thêm một phương pháp mà không liên quan đến sự kiên trì", sau đó bạn cần phải sử dụng @Transient chú thích vào phương pháp getAllChildNodes()

+0

Tôi đang bối rối. Không thêm chức năng bổ sung như getAllChildNodes() hoặc publish() chẳng hạn, làm cho nó không phải là POJO nữa? Và do đó vi phạm một nguyên tắc thiết kế của các đối tượng ngủ đông phải là POJO và do đó "xấu"? Nhưng tại sao nó lại tệ? Tôi muốn làm điều này nhưng tôi không chắc chắn nếu nó là đúng cách. – pete

-1

Mở tệp .java và viết phương thức có tên getAllChildNodes().

Hibernate không viết mã cho bạn, nó ánh xạ các trường trong cơ sở dữ liệu của bạn vào mã của bạn. Đó là tất cả. Nếu bạn muốn có thêm logic trong miền của bạn/mô hình lớp học bên cạnh các getters bình thường và setters cho tài sản của bạn, bạn sẽ phải thêm chúng mình.

1

Có hai cách xác định cấu trúc của tổ chức của bạn .

  • sử dụng chú thích trên các biến thể hiện của thực thể của bạn hoặc
  • sử dụng chú thích về các phương pháp getter của tổ chức của bạn

Khi sử dụng các chú thích về phương pháp getter, Hibernate giả định rằng mỗi getXxx (và isXxx đối với các kiểu boolean) đại diện cho định nghĩa của một thuộc tính liên tục. Và điều này giữ ngay cả khi trình thu thập đặc biệt đó không chứa bất kỳ chú thích nào, như trong trường hợp của bạn.

Hibernate cũng hy vọng sẽ tìm thấy phương thức setter phù hợp cho từng thuộc tính liên tục. Và trong trường hợp của bạn đó là những gì còn thiếu và gây ra ngoại lệ.

Bạn có thể giải quyết vấn đề này bằng cách khai báo trình thu thập tùy chỉnh của mình dưới dạng @Transient cho biết trình khởi động này không đại diện cho thuộc tính liên tục. Một cách khác là chuyển đổi thực thể để sử dụng chú thích trên các biến cá thể. Sau này sẽ là sự lựa chọn cá nhân của tôi.

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