2012-09-10 37 views
11

Câu hỏi này về cơ bản là đối diện với this one.Làm sao để Hibernate bỏ qua một phương thức?

Tôi có một phương pháp như vậy:

public boolean isVacant() { 
    return getEmployeeNum() != null && getEmployeeNum().equals("00000000"); 
} 

Khi tôi tải nó lên, Hibernate được phàn nàn rằng tôi không có thuộc tính gọi là vacant. Nhưng tôi không muốn một thuộc tính được gọi là vacant - Tôi không cần phải lưu trữ dữ liệu đó - nó đơn giản là logic.

Hibernate nói:

org.hibernate.PropertyNotFoundException: Không thể tìm thấy một setter cho bất động sản bị bỏ trống trong lớp com.mycomp.myclass ...

Có một chú thích tôi có thể thêm phương pháp isVacant() để làm cho Hibernate bỏ qua nó?

Trả lời

25

Thêm @Transient vào phương pháp sau đó Hibernate nên bỏ qua nó.

Để trích dẫn Hibernate Documentation:

Mỗi phi tĩnh bất động sản thoáng qua không (trường hoặc phương pháp tùy thuộc vào loại truy cập) của một tổ chức được coi là dai dẳng, trừ khi bạn chú thích nó như @Transient.

+0

Doh - Tôi nghĩ '@ Tạm thời' chỉ dành cho các trường ... – corsiKa

3

RNJ là đúng, nhưng tôi có thể thêm vào lý do tại sao điều này xảy ra:

Tôi đoán rằng bạn đã chú thích getters của lớp dai dẳng của mình. Các tiền tố được sử dụng bởi các hạt java là "set" và "get", được sử dụng để đọc và ghi vào các biến, nhưng cũng có tiền tố "is", được sử dụng cho các giá trị boolean (thay vì "get"). Khi Hibernate thấy lớp liên tục có chú giải getter của bạn, và tìm ra một phương thức "isVacant", nó giả định rằng có một thuộc tính "trống", và giả sử rằng có một "set" -method là tốt.

Vì vậy, để khắc phục sự cố, bạn có thể thêm chú thích @Transient hoặc bạn có thể thay đổi tên của phương thức thành một cái gì đó không bắt đầu bằng "is". Tôi không nghĩ rằng đây sẽ là vấn đề nếu lớp học của bạn được chú thích trên các trường, thay vì các phương thức get.

+3

Tuy nhiên, vấn đề đổi tên phương thức là quá trình chia nhỏ quá. Theo quy ước, các phương thức trả về các boolean (cho dù chúng là các thành viên) có bắt đầu bằng hay không. Xem xét phương thức 'java.util.Collection'' isEmpty() '- hầu hết Bộ sưu tập không lưu trữ chúng có trống hay không - chúng so sánh kích thước của chúng với 0. (Điều này không đúng đối với tất cả các bộ sưu tập, ví dụ' ConcurrentLinkedQueue' nhưng hầu hết là để 'AbstractCollection' triển khai thực hiện như vậy.) – corsiKa

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