Подтвердить что ты не робот

Javax.persistence Аннотации на поле, геттер или сеттер?

В настоящее время я изучаю Hibernate и Java Persistence API.

У меня есть класс @Entity и нужно применять аннотации к различным полям. Я включил в код ниже все три места, куда они могли пойти.

Должен ли я применять их к самому полю, получателю или сеттеру? И какова семантическая разница, если таковая имеется, между этими тремя параметрами.

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;
    }
}
4b9b3361

Ответ 1

Вам нужно выбирать между полем и геттером. Аннотации по сеттерам не поддерживаются. И все аннотации должны быть на полях, или все они должны быть на геттерах: вы не можете смешивать оба подхода (за исключением случаев, когда вы используете @AccessType аннотация).

Относительно того, какой из них предпочтительнее, ответ: это зависит. Я предпочитаю доступ к полю, но YMMV, и есть ситуации, когда доступ к свойствам предпочтительнее. См. Hibernate Annotations - что лучше, доступ к полям или свойствам?.

Ответ 2

Вы должны помещать аннотации только для поля или только для 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;
}

или

private int    id;

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

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

И для всех полей/свойств одинаково. Все аннотации для полей или всех аннотаций для getter