4

假设 JPA 实体(例如)具有自动生成的长 id:

@Entity
@AutoProperty
public class SomeItem {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)   
    private long Id;

    ...

}

是否有任何理由不为此 ID 生成 setter 和 getter?例如,人们可能不想生成 setter,因为 JPA 负责生成 ID。

4

3 回答 3

21

我看到其他评论误导了你,所以我觉得自己有义务详细说明这个问题,即使我不能给你一个科学和完整的答案。@vcetinick 写了当前接受的答案:

可能会发现您可能能够摆脱 [..] 事物的持久性方面。

这句话尤其是错误的。一切都取决于您将@Id注释放在哪里。规范说:

如果实体具有基于字段的访问权限,则持久性提供程序运行时直接访问实例变量。

因此,您不需要以任何方式提供 setter 或 getter。因为您注释了您的字段而不是 getter 方法(注释 setter 方法将被忽略并且没有影响)。

但是,如果您编写了一个 getter 方法,并使用您的 @Id 注释而不是您的字段来注释此方法,那么我们将告诉我们的持久性提供者通过访问器 ( getter ) 和 mutator ( setter ) 方法访问我们的字段而不使用反射. 在这种情况下, getter 和 setter应该存在。Pro JPA 2: Mastering the Java™ Persistence API一书在第 71 页上写道(我的粗体标记!):

当使用属性访问模式时,适用与 JavaBeans 相同的约定,并且必须有用于持久属性的 getter 和 setter 方法。属性的类型由getter方法的返回类型决定,必须与传入setter方法的单个参数的类型相同。这两种方法都必须是公共的或受保护的可见性

因此,我通常会注释我的 id 字段,并编写 setter 和 getter 方法,但 setter 方法我给予受保护的访问。我只是不希望任何其他代码片段对如此重要的字段具有轻松的写入权限。我不知道这是否会导致其他领域出现问题。我不是专家。但是我也找不到任何理由说明为什么以这种方式设置 id 属性。另请参阅Netbeans 论坛

于 2013-02-16T20:17:35.703 回答
6

您可能会发现,无需从事物的持久性方面将 getter/setter 放在 JPA 实体上,您就可以摆脱困境。但是,如果您开始处理从其他来源序列化的实体,甚至在某些情况下从您的角度来看,您将需要一种方法来设置实体的 ID,以让 JPA 知道它正在处理现有实体,如果您不能设置id,那么持久层只会把它当作一个新的对象。

于 2012-09-11T12:48:40.040 回答
2

Id是您的主键,没有它您将永远无法在数据库中插入记录。在您的情况下 @GeneratedValue(strategy=GenerationType.AUTO),它确保id将为每个生成,persist但您还需要一种方法来访问它,因为它是entity您应该提供访问它的主要标识。

就像你问某人他的名字,他没有提供给你,你会觉得他只是粗鲁。

于 2012-09-11T12:37:01.707 回答