我是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
}
答案 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字段注释 在同一个实体中。这样做会导致未指定的行为,并且非常 可能会导致错误。