Java 将JPA注释添加到字段和getter之间有什么区别?
一般来说,我对Spring Boot和JPA都是新手。我见过在字段声明上添加JPA注释的示例,例如: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);
@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请接受我下面的答案,这样我也会得到一些分数。