Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JPA注释添加到字段和getter之间有什么区别?_Java_Jpa_Spring Boot_Groovy - Fatal编程技术网

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

Java 将JPA注释添加到字段和getter之间有什么区别?,java,jpa,spring-boot,groovy,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);

一般来说,我对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
}

默认情况下,JPA提供程序访问实体字段的值,并将这些字段映射到数据库列 使用实体的JavaBean属性访问器(getter)和mutator(setter)方法。因此 实体中私有字段的名称和类型对JPA并不重要。相反,JPA只关注 JavaBean属性访问器的名称和返回类型。您可以使用
@javax.persistence.Access
注释来更改它,它使您能够显式地指定访问方法 JPA提供商应该雇佣的

@Entity
@Access(AccessType.FIELD)
public class SomeEntity implements Serializable
{
...
}
AccessType枚举的可用选项有
属性
(默认值)和
字段
。具有
PROPERTY
,提供程序使用JavaBean属性方法获取和设置字段值<代码>字段makes 提供程序使用实例字段获取和设置字段值。作为最佳实践,你应该坚持下去 除非有令人信服的理由这样做,否则使用JavaBean属性

你 可以将这些属性批注放在私有字段或公共访问器方法上。如果 您可以使用
AccessType.PROPERTY
(默认)并注释私有字段,而不是JavaBean 在访问器中,字段名必须与JavaBean属性名匹配。然而,这些名字并不重要 如果注释JavaBean访问器,则必须匹配。同样,如果使用
AccessType.FIELD
和 注释JavaBean访问器而不是字段,字段名也必须与JavaBean匹配 属性名称。在这种情况下,如果对字段进行注释,则它们不必匹配。最好是 保持一致,并为
AccessType.PROPERTY
的JavaBean访问器和
AccessType.FIELD

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

bro请接受我下面的答案,这样我也会得到一些分数。