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

标签 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
}

最佳答案

默认情况下,JPA 提供程序访问实体字段的值并将这些字段映射到数据库列 使用实体的 JavaBean 属性访问器 (getter) 和修改器 (setter) 方法。因此, 实体中私有(private)字段的名称和类型对 JPA 无关紧要。相反,JPA 只查看 JavaBean 属性访问器的名称和返回类型。您可以使用 @javax.persistence.Access 批注更改它,这使您能够明确指定访问方法 JPA 提供者应该使用的。

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

AccessType 枚举的可用选项是 PROPERTY(默认值)和 FIELD。和 PROPERTY,提供者使用 JavaBean 属性方法获取和设置字段值。 FIELD 使 提供者使用实例字段获取和设置字段值。作为最佳实践,您应该坚持 使用默认值并使用 JavaBean 属性,除非您有令人信服的理由不这样做。

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

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

关于java - 将 JPA 注释添加到字段与 getter 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256489/

相关文章:

hibernate - 如何编写与集合完全匹配的 JPA 条件查询?

java - 与 Scala/Akka Actor 相比,Java 线程有多重?

java - 是否可以将java类对象序列化为类文件?

java - 使用JPA的问题

spring-boot - 带有私有(private)仓库的 Spring Boot Gradle bootBuildImage 任务

Docker - Spring Boot 应用程序 - 无法访问本地主机上的 MySql 服务器

java - 创建自定义 Flowable 任务

java - 广播组崩溃

java - JPanel 中的 GridBagLayout JLabels 和 JTextAreas 组织

java - 如何获取 Eclipselink 实体管理器?