2009-06-02 23 views
31

Tôi có một câu hỏi đơn giản về cách sử dụng Hibernate. Tôi tiếp tục thấy mọi người sử dụng chú thích JPA theo một trong hai cách bằng cách chú thích các trường của một lớp và cũng bằng cách chú thích phương thức get trên các bean tương ứng.Hibernate/JPA - chú thích các phương thức đậu so với các trường

Câu hỏi của tôi như sau: Có sự khác biệt giữa chú thích các trường và phương thức bean với các phụ đề JPA như @Id hay không.

dụ:

@Entity 
public class User 
{ 

**@ID** 
private int id; 

public int getId(){ 
return this.id; 
} 

public void setId(int id){ 
this.id=id; 
} 

} 

----------- HOẶC -----------

@Entity 
public class User 
{ 


private int id; 

**@ID** 
public int getId(){ 
return this.id; 
} 

public void setId(int id){ 
this.id=id; 
} 

} 

Trả lời

41

Có, nếu bạn chú thích các lĩnh vực , Hibernate sẽ sử dụng truy cập trường để đặt và nhận các trường đó. Nếu bạn chú thích các phương thức, hibernate sẽ sử dụng getters và setters. Hibernate sẽ chọn phương thức truy cập dựa trên vị trí của chú thích @Id và với kiến ​​thức của tôi, bạn không thể kết hợp và khớp. Nếu bạn chú thích một trường có @Id, chú thích trên các phương thức sẽ bị bỏ qua và ngược lại. Bạn cũng có thể đặt phương thức theo cách thủ công bằng chú thích cấp lớp @AccessType

Đã chứng minh là một tài nguyên cực kỳ hữu ích cho các câu hỏi như thế này và chi tiết cách loại truy cập xếp tầng phân cấp xuống.

+0

@David - Có, tôi tin rằng điều này cũng tương tự đối với JPA. Tuy nhiên JPA không hỗ trợ @AccessType –

+0

Một sửa chữa, bạn thực sự có thể kết hợp cách tiếp cận này. Ý tôi là bạn có thể có một lớp có AccessType.PROPERTY và AccessType.FIElD. Mặc dù nó không được khuyến khích nhưng bạn có thể làm điều đó. –

+0

Cảm ơn đây phải là câu trả lời được chấp nhận. Đặc biệt là phần kết hợp và khớp. – cabaji99

2

Đề xuất của tôi là chú thích các phương pháp. Bằng cách đó, bạn có được một chút linh hoạt. Ví dụ, giả sử bạn có một vài lớp:

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntity xác định id lĩnh vực/getter/setter. Các lớp học StringIdEntityAutoIdEntity được kế thừa từ AbstractEntity, nhưng sử dụng các chiến lược @Id khác nhau. Nếu bạn chú thích trường, bạn không thể thay đổi nó từ lớp này sang lớp khác.

Nếu bạn chú thích phương pháp, bạn đánh dấu getId()@Transient/abstract trong AbstractEntity và sau đó trong các lớp con, bạn chỉ cần ghi đè phương pháp và áp dụng chiến lược bạn muốn sử dụng. Tôi đã từng tự chú thích các trường và chạy vào điều này và quyết định rằng tôi sẽ luôn chú thích các phương thức di chuyển về phía trước. Vì vậy, ngay cả khi bạn không thấy lợi ích của chú thích phương pháp ngay lập tức, nó có thể trở nên rõ ràng xuống dòng khi bạn có rất nhiều lớp học mà chuyển đổi sẽ trở thành một nhức đầu tuyệt đối.

3

Tại sao bạn chú thích người truy cập? Nó chỉ trông trơn tru đơn giản và là một nỗi đau để duy trì. Bây giờ tôi phải đi săn khắp lớp để tìm hiểu cách áp dụng JPA hoặc Hibernate. Khi làm việc với một số trình tạo mã Hibernate cho Eclipse, đây là mặc định và nó điều khiển tôi những bonker.

Chưa kể rằng một lý do khác mà chúng tôi sử dụng trình truy cập là thêm logic vào quyền truy cập thuộc tính hoặc tham chiếu cha mẹ hoặc đối tượng khác không khớp với chú thích đã nói.

+1

Bạn có thể sửa đổi vị trí chú thích bằng cách sử dụng mẫu, dưới đây là hướng dẫn chi tiết về cách thay đổi vị trí chú thích từ accessor thành trường: http://stackoverflow.com/questions/1861817/hibernate-moving-annotations-from-property-method- cấp độ cấp trường – Grubhart

1

Có một số thảo luận có sẵn cho phép sử dụng FIELD trên tài sản (xem - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype). Ngay cả khuôn khổ mùa xuân cũng khuyến cáo sử dụng FIELD trên tài sản (xem - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html). Tôi tìm thấy cách tiếp cận sạch hơn FIELD không chỉ bởi vì bạn không bị buộc phải thực hiện setters/getters nhưng bạn có thể có setters loại tùy chỉnh của bạn/getters trong lớp học của bạn. Vì vậy, một đóng gói tốt hơn và các lớp học sạch sẽ hơn. Hiệu suất khôn ngoan FIELD có lợi thế hơn so với THUỘC TÍNH nhưng không đáng kể.

IN một dòng sử dụng FIELD trên THUỘC TÍNH. Sử dụng THUỘC TÍNH nếu bạn thực sự cần nó.

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