6.5版本已正式发布!
Java 时间处理
现在,Java 时间对象可以直接通过 JDBC 驱动进行序列化,这符合 JDBC 4.2 的定义。在之前的版本中,Hibernate 会使用 java.sql.Date
、java.sql.Time
或 java.sql.Timestamp
引用作为中间形式来处理 Java 时间对象。
此外,本版本还改变了时区处理方式。OffsetDateTime
、OffsetTime
和 ZonedDateTime
都包含显式的时区信息。在直接序列化的情况下,Hibernate 只会直接传递值。在旧的行为中,由于 java.sql
变体不包含时区信息,Hibernate 通常需要特别处理时区,以便在转换为这些中间形式时进行转换。
对于 6.5 版本,此行为默认禁用。要启用,
hibernate.type.java_time_use_direct_jdbc=true
请参阅 设置 Javadoc 以获取更多详细信息。
已知此功能与 Sybase jConnect 驱动不兼容,尽管此功能自 JDBC 4.2(Java 8)以来一直是 JDBC 的一部分。我们已经通知了 Sybase 开发团队,但这种情况似乎不太可能改变。 |
可配置的查询缓存布局
在 Hibernate ORM 6.0 中,查询缓存布局从实体和集合的“浅层”表示更改为“完全”表示。这样做是为了支持从查询缓存数据中重新加载联接检索的数据,而无需访问数据库。在查询缓存中存储完整数据会导致更高的内存消耗,这可能会因为更高的垃圾收集活动而损害应用程序的吞吐量。
6.5 添加了配置查询结果在查询缓存中存储格式的功能,可以是
-
通过全局的
hibernate.cache.query_cache_layout
设置 -
通过实体或集合的
@QueryCacheLayout
注解
全局 hibernate.cache.query_cache_layout
设置默认为 AUTO
值,该值会根据实体/集合是否可缓存自动选择 SHALLOW
或 FULL
。
希望保留Hibernate ORM 6.0所使用的FULL
缓存布局的应用程序应配置全局属性hibernate.cache.query_cache_layout=FULL
。希望使用Hibernate ORM 5及更早版本所使用的缓存布局的应用程序应配置全局属性hibernate.cache.query_cache_layout=SHALLOW
。
即使使用 使用 |
允许将Java记录作为@IdClass
现在可以将Java记录用作@IdClass
record PK(Integer key1, Integer key2) {}
@Entity
@IdClass(PK.class)
class AnEntity {
@Id Integer key1;
@Id Integer key2;
...
}
支持自动启用的过滤器
现在可以为每个Session和StatelessSession自动启用过滤器
@FilterDef(
name="active-filter",
condition="status = true",
autoEnabled=true
)
@Filter(name="active-filter")
@Entity
class DeletableEntity {
...
}
可以与动态解决条件参数的能力结合使用,例如。
class TenantIdResolver implements Supplier<String> {
@Override
public String get() {
return SomeContext.determineTenantId();
}
}
@FilterDef(
name="tenancy-filter",
condition="tenant_id = :tenantId",
autoEnabled=true,
parameter = @ParamDef(
name="tenantId",
type=String.class,
resolver=TenantIdResolver.class
)
)
@Filter(name="tenancy-filter")
@Entity
class SensitiveData {
...
}
使用自定义Generator
手动分配标识符
现在可以通过新的allowAssignedIdentifiers()
方法使用自定义的Generator
来使用手动分配的标识符值。
class MyIdGenerator implements Generator {
...
@Override public boolean allowAssignedIdentifiers() {
return true;
}
}
@IdGeneratorType(MyIdGenerator.class)
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@interface MyGeneratedId {
}
@Entity
class Book {
@Id @MyGeneratedId
Integer id;
...
}
Book book = new Book(1,...)
session.persist(book);
SelectionQuery.getResultCount()
选择查询现在能够报告最终结果中的结果数量。
这会触发对数据库的查询。 |
Query query = session.createQuery("from Person");
int results = query.getResultCount();
基于键的分页
有关更多信息,请参阅KeyedPage
和KeyedResultList
的Javadoc。
插入查询的ON CONFLICT子句
现在,HQL和Criteria都支持可选的ON CONFLICT子句,以允许在违反约束时控制应发生什么,例如。
insert into Person (id, name)
values (1, 'John')
on conflict do nothing
有关详细信息,请参阅用户指南。