在外部管理資料庫模式時(例如使用 Liquibase),除了指定 Liquibase 變更集外,您還必須使用 JPA 注釋幫助 Hibernate 理解您的資料結構。
雖然一些注釋涉及底層資料的更高級別的抽象,例如@Embeddedor @OneToMany,但其他較低級別的注釋,例如@Column(length = 255, nullable = false),似乎只表示基礎資料庫模式 ( varchar(255) not null) 中已經定義的內容。因此,同時指定兩者感覺是多余的,并且提出了幾個我在檔案中找不到明確答案的問題:
[主要問題] 哪些@Column設定(除了name和)僅用于 DDL 創建,因此如果資料庫模式是在外部管理的,則可以安全地省略insertable?
我的猜測是:、和,但我不確定 Hibernate 是否會在內部使用它們。那么and呢,Hibernate 是否會考慮這些以優化查詢,或者也可以忽略這些?updatablecolumnDefinitionlengthprecisionscalenullableunique
作為測驗,我嘗試將 null 寫入不可為空的資料庫列,唯一的區別是指定
@Column(nullable = false)例外將源自EntityManager而不是資料庫驅動程式,這對應用程式無關緊要(編輯:假設這是一個例外情況)。
[附帶問題 1] Hibernate 是否假定單列主鍵的唯一性和不可為空性,因此@Column(unique = true, nullable = false)可以在也具有的屬性上省略設定@Id?
[附帶問題 2] 由于 Hibernate 能夠檢查資料庫模式(例如,在使用時hbm2ddl.auto=validate),是否可以將其配置為從底層模式中提取所需的型別和約束資訊,以便@Column可以省略其中的設定?
uj5u.com熱心網友回復:
Hibernate 確實使用了一些注釋成員,特別是從版本 6 開始。我建議您研究像 JPABuddy 這樣的工具,它可以根據您的物體和 liquibase 模型之間的差異生成 Liquibase 變更集。過去,我在 JUnit 測驗中實作了這樣的差異。該測驗創建了兩個資料庫,一個通過 hbm2ddl,一個通過 liquibase 模型。最后,它對兩者進行比較,如果有差異,則測驗失敗,報告差異的 XML 序列化形式。
這樣,兩個模型很容易保持同步,您也不需要 hbm2ddl 驗證。
在這里,您可以看到運行時模型接收資訊,如length、和:https://github.com/hibernate/hibernate-orm/blob/6.1.3/hibernate-core/src/main/java/org/hibernate/metamodel/映射/內部/MappingModelCreationHelper.java#L262precisionscalecolumnDefinition
在這里您可以看到正在使用的資訊:https ://github.com/hibernate/hibernate-orm/blob/6.1.3/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/ AbstractSqlAstTranslator.java#L3629
這種特殊用途是用于轉換引數,以推斷映射屬性的型別,即在查詢中如... where alias.attribute = :param. 在某些情況下,某些資料庫可能要求引數標記由 SQL 中的強制轉換包裝。
所以這只是 Hibernate 如何使用這些資訊的一個小例子。如果您研究 Hibernate 代碼,您可能會發現一些其他用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513453.html
標籤:爪哇休眠jpa液基
上一篇:來自同一子查詢的最小值和最大值
