休眠实体类的构造函数

问题描述 投票:1回答:2

在我的域实体类中,我有一个属性想要用作主键(GenerationType.AUTO){供JPA Criteria API使用}。我想为此Entity类定义一个构造函数,该构造函数将初始化除主键属性以外的所有属性,因为Hibernate将提供此值。

换句话说,构造函数将使Primary Key属性未定义。我个人没有看到任何问题,但是我希望这种方法得到专家的审查。

问题

  • 定义在初始化其他属性时将属性映射到主键undefined的Entity构造函数是一种好习惯吗?
hibernate jpa
2个回答
1
投票

根据this

实体类必须具有公共或受保护的无参数构造函数。 它可能还会定义其他构造函数。

以及更多

JPA要求将此构造函数定义为public或protected。大多数情况下,只要系统SecurityManager允许覆盖可见性设置,Hibernate都不在乎构造函数的可见性。也就是说,如果您希望利用运行时代理生成,则应至少使用包可见性来定义构造函数。

但也请参阅this。有时在构造函数参数中包含一个实体ID很有用。


1
投票

JPA specification document(2.2版)在2.4节,第31页中给出答案:

其主键的值唯一地标识持久性上下文中的一个实体实例,并标识为第3章“实体操作”中所述的EntityManager操作。 应用程序不得更改主键[10]的值。如果发生这种情况,其行为为undefined

[10] 这包括不更改作为主键或组合主键属性的可变类型的值。

因此,使用构造函数初始化或设置主键的值可能不是一个好主意,因为“ 未定义行为”可能由此产生。

请注意-根据JPA规范-还必须在每个实体类中提供带有自定义构造函数的无参数构造函数(如您的问题所述)。在规范中搜索“构造函数”以获取更多详细信息,尤其是Section 2.1

恕我直言,这应该指导您做出好的设计选择。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.