将JPA注释添加到字段与getter之间有什么区别?

时间:2017-04-06 13:21:40

标签: java jpa spring-boot groovy

我是Spring Boot和JPA的新手。我已经看到了在字段声明中添加JPA注释的示例,例如:

@Entity
public class Fizz {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // other fields

    public Fizz(Long id) {
        super();

        setId(id);
    }

    // setter defined here

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

...以及在getter上添加相同注释的示例:

@Entity
public class Fizz {
    private Long id;

    // other fields

    public Fizz(Long id) {
        super();

        setId(id);
    }

    // setter defined here

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return this.id;
    }
}

我想知道它们在语义上是否相同,或者是否有不同的用例,您选择的是另一个。我问,因为我实际上是在Groovy中编写Spring Boot / JPA应用程序,而您通常不会定义getter:

@Canonical
@Entity
class Fizz {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id
}

1 个答案:

答案 0 :(得分:5)

默认情况下,JPA提供程序访问实体字段的值并将这些字段映射到数据库列 使用实体的JavaBean属性访问器(getter)和mutator(setter)方法。就这样, 实体中私有字段的名称和类型与JPA无关。相反,JPA只关注 JavaBean属性访问器的名称和返回类型。您可以使用@javax.persistence.Access注释对其进行更改,这样您就可以明确指定访问方法 JPA提供商应该使用。

@Entity
@Access(AccessType.FIELD)
public class SomeEntity implements Serializable
{
...
}

AccessType枚举的可用选项为PROPERTY(默认值)和FIELD。同 PROPERTY,提供程序使用JavaBean属性方法获取并设置字段值。 FIELD制作 提供者使用实例字段获取和设置字段值。作为最佳实践,你应该坚持下去 默认情况下使用JavaBean属性,除非您有其他令人信服的理由。

您 可以将这些属性注释放在私有字段或公共访问器方法上。如果 您使用AccessType.PROPERTY(默认)并注释私有字段而不是JavaBean 访问者,字段名称必须与JavaBean属性名称匹配。但是,名字没有 如果您注释JavaBean访问器,则必须匹配。同样,如果您使用AccessType.FIELD和 注释JavaBean访问器而不是字段,字段名称也必须与JavaBean匹配 财产名称。在这种情况下,如果您注释字段,则不必匹配。这是最好的 保持一致并注释AccessType.PROPERTY的JavaBean访问器及其字段 AccessType.FIELD

您永远不应混用JPA属性注释和JPA字段注释 在同一个实体中。这样做会导致未指定的行为,并且非常 可能会导致错误。