2012-01-22 30 views
12

Tôi hiện đang học Hibernate và Java Persistence API.javax.persistence Chú thích trên trường, getter hoặc setter?

Tôi có lớp @Entity và cần áp dụng chú thích cho các trường khác nhau. Tôi đã bao gồm trong mã dưới đây cả ba nơi họ có thể đi.

Tôi có nên áp dụng chúng cho chính trường đó, bộ thu thập hoặc bộ đặt không? Và sự khác biệt ngữ nghĩa, nếu có, giữa ba lựa chọn này.

import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.persistence.Id; 

@Entity 
@Table(name = "song") 
public class Song { 
    // Annotations should only be applied to one of the below 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    private int id; 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    public int getId() { 
     return id; 
    } 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    public void setId(int id) { 
     this.id = id; 
    } 
} 
+0

Có thể trùng lặp http://stackoverflow.com/questions/4188048/why-should-anybody-put-annotations-on-the-getters-or-setters-when-using- jpa-to-m –

+0

Chú thích trên các trình cài đặt không được hỗ trợ vì khó xác định loại lớp của trường bằng cách sử dụng sự phản chiếu cho trình thiết lập. Đối với một getter, tất cả những gì bạn phải làm là kiểm tra kiểu trả về của phương thức. Nhưng đối với một setter, bạn sẽ làm gì nếu bạn đang truyền nhiều tham số cho nó? –

Trả lời

27

Bạn phải chọn giữa trường và getter. Chú thích trên trình cài đặt không được hỗ trợ. Và tất cả chú thích phải ở trên các trường hoặc tất cả các chú thích đều phải có trên getters: bạn không thể kết hợp cả hai cách tiếp cận (trừ khi bạn sử dụng chú thích @AccessType).

Liên quan đến ưu tiên nào là ưu tiên, câu trả lời là: tùy thuộc. Tôi thích truy cập trường, nhưng YMMV, và có những tình huống mà quyền truy cập thuộc tính là thích hợp hơn. Xem Hibernate Annotations - Which is better, field or property access?.

+1

Cũng phát hiện ra rằng bạn có thể sử dụng nó để getId() mà không cần lấy toàn bộ đối tượng http://stackoverflow.com/questions/2593722/hibernate-one-to-one-getid-without-fetching-entire-object/3238182# 3238182 –

+1

Từ: http://java.dzone.com/articles/jpa-implementation-patterns-7 Tải trọng chậm trong Hibernate - Việc cài đặt tải chậm của Hibernate luôn khởi tạo proxy lười khi bất kỳ phương thức nào trên proxy đó được gọi. Ngoại lệ duy nhất cho điều này là phương thức được chú thích bằng chú thích @Id khi bạn sử dụng quyền truy cập thuộc tính. Nhưng khi bạn sử dụng truy cập trường không có phương pháp như vậy và Hibernate khởi tạo proxy ngay cả khi gọi phương thức trả về danh tính của thực thể. –

2

Bạn phải đặt chú thích chỉ dành cho lĩnh vực hoặc chỉ cho getter

@Id 
@Column(name="id", unique=true, nullable=false) 
private int id; 

public int getId() { 
    return id; 
} 

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

hoặc

private int id; 

@Id 
@Column(name="id", unique=true, nullable=false) 
public int getId() { 
    return id; 
} 

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

Và đối với tất cả các lĩnh vực/tài sản trong cùng một cách. Tất cả chú thích cho trường hoặc tất cả chú thích cho getter

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