字段、getter或setter上的javax.persistence注释?

字段、getter或setter上的javax.persistence注释?,java,hibernate-mapping,Java,Hibernate Mapping,我目前正在学习Hibernate和Java持久性API 我有一个@Entity类,需要对各个字段应用注释。我在下面的代码中包含了他们可以去的所有三个地方 我应该将它们应用于字段本身,getter还是setter?这三个选项之间的语义差异是什么 import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.Id; @Entity @Table(name = "song") pub

我目前正在学习Hibernate和Java持久性API

我有一个@Entity类,需要对各个字段应用注释。我在下面的代码中包含了他们可以去的所有三个地方

我应该将它们应用于字段本身,getter还是setter?这三个选项之间的语义差异是什么

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

您必须在field和getter之间进行选择。不支持setter上的批注。所有注释都应该在字段上,或者都应该在getter上:不能将这两种方法混合使用(除非使用注释)


关于哪一个更合适,答案是:这要看情况而定。我更喜欢现场访问,但YMMV,在某些情况下,更喜欢财产访问。请参阅。

您必须仅为字段或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;
}


对于所有字段/属性,使用相同的方式。不支持字段的所有注释或getter的所有注释

setter上可能重复的注释,因为使用setter的反射来确定字段的类类型更加困难。对于getter,您所要做的就是检查方法的返回类型。但对于setter,如果要向其传递多个参数,该怎么办?还发现,您可以将其用于getId(),而无需从中获取整个对象:Hibernate中的延迟加载-Hibernate的延迟加载实现总是在调用该代理上的任何方法时初始化延迟代理。唯一的例外是使用属性访问时使用@Id注释注释的方法。但是当您使用字段访问时,没有这样的方法,Hibernate甚至在调用返回实体标识的方法时也会初始化代理。
@Id 
@Column(name="id", unique=true, nullable=false)
private int    id;

public int getId() {
    return id;
}

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