jpa vue管理系统_从JPA到Hibernate的旧版和增强型标识符生成器

jpa vue管理系统

jpa vue管理系统

JPA标识符生成器

JPA定义了以下标识符策略:

战略描述
汽车持久性提供程序选择基础数据库支持的最合适的标识符策略
身份标识符由数据库IDENTITY列分配
顺序持久性提供程序使用数据库序列来生成标识符
持久性提供程序使用单独的数据库表来模拟序列对象

在我以前的文章中,我举例说明了所有这些替代标识符策略的优缺点。

标识符优化器

尽管没有太多应用程序侧IDENTITY生成器优化(除了配置数据库标识预分配),但序列标识符在这方面提供了更大的灵活性。 最常见的优化策略之一是基于高/低分配算法

为此,Hibernate提供了:

发电机 描述
SequenceHiLoGenerator 它使用数据库序列生成hi值,而低值根据hi / lo算法递增
TableHiLoGenerator 数据库表用于生成hi值。 不推荐使用此生成器,而推荐使用MultipleHiLoPerTableGenerator,增强的TableGenerator或SequenceStyleGenerator。
多重HiLo PerTableGenerator 它是一个高/低表生成器,即使对于多个标识符序列,也可以使用单个数据库表。
SequenceStyleGenerator 它是先前序列生成器的增强版本。 如果基础数据库支持,则使用序列。 如果当前数据库不支持序列,它将切换为使用表来生成序列值。 当以前的生成器具有预定义的优化算法时,可以使用优化器策略配置增强型生成器:
  • none :没有应用优化策略,因此从数据库中获取每个标识符
  • hi / lo :它使用原始的hi / lo算法。 这种策略使其他系统难以共享相同的标识符序列,从而要求其他系统实现相同的标识符生成逻辑。
  • pooled :此优化器使用了一个高/低优化策略,但是不是保存当前的高值,而是存储当前范围的上边界(或下边界– hibernate.id.optimizer.pooled.prefer_lo )。

池化是默认的优化器策略。

表格生成器 与MultipleHiLoPerTableGenerator一样,它可以将一个表用于多个标识符生成器,​​同时提供可配置的优化器策略。

池化是默认的优化器策略。

JPA到Hibernate标识符映射

拥有如此丰富的生成器,我们不禁要问哪个被用作默认的JPA生成器。

尽管JPA规范并不意味着进行任何特定的优化,但Hibernate宁愿选择一种优化的生成器,而不是总是为每个新标识符访问数据库的优化生成器。

JPA

我们将定义一个配置有SEQUENCE JPA标识符生成器的实体。 单元测试将保留五个这样的实体。

@Entity(name = "sequenceIdentifier")
public static class SequenceIdentifier {

    @Id
    @GeneratedValue(generator = "sequence", strategy=GenerationType.SEQUENCE)
    @SequenceGenerator(name = "sequence", allocationSize = 10)
    private Long id;
}

@Test
public void testSequenceIdentifierGenerator() {
    LOGGER.debug("testSequenceIdentifierGenerator");
    doInTransaction(new TransactionCallable<Void>() {
        @Override
        public Void execute(Session session) {
            for (int i = 0; i < 5; i++) {
                session.persist(new SequenceIdentifier());
            }
            session.flush();
            return null;
        }
    });
}

运行此测试,我们将提供以下输出

Query:{[call next value for hibernate_sequence][]} 
Generated identifier: 10, using strategy: org.hibernate.id.SequenceHiLoGenerator
Generated identifier: 11, using strategy: org.hibernate.id.SequenceHiLoGenerator
Generated identifier: 12, using strategy: org.hibernate.id.SequenceHiLoGenerator
Generated identifier: 13, using strategy: org.hibernate.id.SequenceHiLoGenerator
Generated identifier: 14, using strategy: org.hibernate.id.SequenceHiLoGenerator
Query:{[insert into sequenceIdentifier (id) values (?)][10]} 
Query:{[insert into sequenceIdentifier (id) values (?)][11]} 
Query:{[insert into sequenceIdentifier (id) values (?)][12]} 
Query:{[insert into sequenceIdentifier (id) values (?)][13]} 
Query:{[insert into sequenceIdentifier (id) values (?)][14]}

Hibernate选择使用旧版SequenceHiLoGenerator来实现与在发布增强型生成器之前开发的所有那些应用程序的向后兼容性。 将旧版应用程序迁移到新生成器上并非易事,因此,增强的生成器是新应用程序的更好替代方案。

默认情况下,Hibernate更喜欢使用“ seqhilo”生成器,这不是一个直观的假设,因为许多人可能希望使用原始的“ sequence”生成器(总是为每个新的标识符值调用数据库序列)。

为了启用增强的生成器,我们需要设置以下Hibernate属性:

properties.put("hibernate.id.new_generator_mappings", "true");

给我们以下输出:

Query:{[call next value for hibernate_sequence][]} 
Query:{[call next value for hibernate_sequence][]} 
Generated identifier: 1, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Generated identifier: 2, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Generated identifier: 3, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Generated identifier: 4, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Generated identifier: 5, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Query:{[insert into sequenceIdentifier (id) values (?)][1]} 
Query:{[insert into sequenceIdentifier (id) values (?)][2]} 
Query:{[insert into sequenceIdentifier (id) values (?)][3]} 
Query:{[insert into sequenceIdentifier (id) values (?)][4]} 
Query:{[insert into sequenceIdentifier (id) values (?)][5]}

新的SequenceStyleGenerator会生成其他标识符值,而不是旧的SequenceHiLoGenerator。 新旧生成器之间的更新语句之所以不同,是因为新生成器的默认优化器策略是“池”的,而旧生成器只能使用“ hi / lo”策略。

JPA

@Entity(name = "tableIdentifier")
public static class TableSequenceIdentifier {

    @Id
    @GeneratedValue(generator = "table", strategy=GenerationType.TABLE)
    @TableGenerator(name = "table", allocationSize = 10)
    private Long id;
}

运行以下测试:

@Test
public void testTableSequenceIdentifierGenerator() {
    LOGGER.debug("testTableSequenceIdentifierGenerator");
    doInTransaction(new TransactionCallable<Void>() {
        @Override
        public Void execute(Session session) {
            for (int i = 0; i < 5; i++) {
                session.persist(new TableSequenceIdentifier());
            }
            session.flush();
            return null;
        }
    });
}

生成以下SQL语句输出:

Query:{[select sequence_next_hi_value from hibernate_sequences where sequence_name = 'tableIdentifier' for update][]} 
Query:{[insert into hibernate_sequences(sequence_name, sequence_next_hi_value) values('tableIdentifier', ?)][0]} 
Query:{[update hibernate_sequences set sequence_next_hi_value = ? where sequence_next_hi_value = ? and sequence_name = 'tableIdentifier'][1,0]} 
Generated identifier: 1, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator
Generated identifier: 2, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator
Generated identifier: 3, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator
Generated identifier: 4, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator
Generated identifier: 5, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator
Query:{[insert into tableIdentifier (id) values (?)][1]} 
Query:{[insert into tableIdentifier (id) values (?)][2]} 
Query:{[insert into tableIdentifier (id) values (?)][3]} 
Query:{[insert into tableIdentifier (id) values (?)][4]} 
Query:{[insert into tableIdentifier (id) values (?)][5]}

与前面的SEQUENCE示例一样,Hibernate使用MultipleHiLoPerTableGenerator来保持向后兼容性。

切换到增强的id生成器:

properties.put("hibernate.id.new_generator_mappings", "true");

给我们以下输出:

Query:{[select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=? for update][tableIdentifier]} 
Query:{[insert into hibernate_sequences (sequence_name, next_val)  values (?,?)][tableIdentifier,1]} 
Query:{[update hibernate_sequences set next_val=?  where next_val=? and sequence_name=?][11,1,tableIdentifier]} 
Query:{[select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=? for update][tableIdentifier]} 
Query:{[update hibernate_sequences set next_val=?  where next_val=? and sequence_name=?][21,11,tableIdentifier]} 
Generated identifier: 1, using strategy: org.hibernate.id.enhanced.TableGenerator
Generated identifier: 2, using strategy: org.hibernate.id.enhanced.TableGenerator
Generated identifier: 3, using strategy: org.hibernate.id.enhanced.TableGenerator
Generated identifier: 4, using strategy: org.hibernate.id.enhanced.TableGenerator
Generated identifier: 5, using strategy: org.hibernate.id.enhanced.TableGenerator
Query:{[insert into tableIdentifier (id) values (?)][1]} 
Query:{[insert into tableIdentifier (id) values (?)][2]} 
Query:{[insert into tableIdentifier (id) values (?)][3]} 
Query:{[insert into tableIdentifier (id) values (?)][4]} 
Query:{[insert into tableIdentifier (id) values (?)][5]}

您可以看到这次使用了新的增强型TableGenerator

有关这些优化策略的更多信息,请阅读原始发行说明

翻译自: https://www.javacodegeeks.com/2014/07/from-jpa-to-hibernates-legacy-and-enhanced-identifier-generators.html

jpa vue管理系统

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值