jpa @外部管理的数据库架构中的列设置

bd1hkmkf  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(142)

在外部管理数据库模式(例如,使用Liquibase)时,除了指定Liquibase变更集之外,还必须使用JPA注解帮助Hibernate理解数据结构。
虽然一些注解涉及底层数据的更高级别抽象,如@Embedded@OneToMany,但其他较低级别的注解,如@Column(length = 255, nullable = false),似乎只表示底层数据库模式(varchar(255) not null)中已经定义的内容。因此,同时指定这两个注解感觉是多余的,并且它提出了几个问题,我在文档中找不到明确的答案:
[main question]哪些@Column设置(除了nameinsertableupdatable之外)仅用于DDL创建,因此如果数据库模式由外部管理,则可以安全地忽略?
我的猜测是:columnDefinitionlengthprecisionscale,但我不确定Hibernate是否会在其他内部使用它们。那么nullableunique呢?Hibernate是否会考虑它们来优化查询,或者是否也会忽略它们?
作为测试,我尝试将null写入不可为null的数据库列,指定@Column(nullable = false)的唯一区别是异常将源自EntityManager,而不是数据库驱动程序,这对应用程序没有多大影响(编辑:假设它是例外情况)。
[side问题1] Hibernate是否假定单列主键的唯一性和非空性,以便在也具有@Id的属性上省略@Column(unique = true, nullable = false)设置?
[side问题2]由于Hibernate能够检查数据库模式(例如,使用hbm2ddl.auto=validate时),是否可以将其配置为从底层模式中提取所需的类型和约束信息,以便可以省略@Column中的设置?

tf7tbtn2

tf7tbtn21#

Hibernate确实使用了一些注解成员,特别是在版本6中。我建议您研究一下像JPADuddy这样的工具,它可以基于实体和liquibase模型之间的差异生成Liquibase变更集。过去,我在JUnit测试中实现了这样的差异。该测试创建了两个数据库,一个通过hbm2ddl,另一个通过liquibase模型。最后,它对这两者进行比较,如果存在差异,则测试失败,报告XML序列化形式的差异。
这样,两个模型就可以轻松地保持同步,而且也不需要hbm2ddl validate。
在这里,您可以看到运行时模型接收lengthprecisionscalecolumnDefinition等信息:https://github.com/hibernate/hibernate-orm/blob/6.1.3/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MappingModelCreationHelper.java#L262
在这里,您可以看到正在使用的信息:https://github.com/hibernate/hibernate-orm/blob/6.1.3/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java#L3629
此特定用途是用于转换推断Map属性类型的参数,例如在... where alias.attribute = :param之类的查询中。在某些情况下,某些数据库可能要求在SQL中使用转换来 Package 参数标记。
这只是Hibernate如何使用这些信息的一个小例子。如果你研究Hibernate代码,你可能会发现一些其他的用法。

相关问题