Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate中重新启动服务器并使用分配大小时,如何忽略ID之间的间隙?_Java_Hibernate - Fatal编程技术网

Java 在hibernate中重新启动服务器并使用分配大小时,如何忽略ID之间的间隙?

Java 在hibernate中重新启动服务器并使用分配大小时,如何忽略ID之间的间隙?,java,hibernate,Java,Hibernate,当我在hibernate中使用allocationsize=10并在db中插入5条记录时,id将为1,2,3,4,5。当我重新启动服务器时,下一个插入id有5个间隙并从11,12,13开始,…有什么办法解决这个问题吗?在id中没有间隙很重要吗? 我搜索并设置 <prop key="hibernate.id.new_generator_mappings">true</prop> spring.xml: <bean id="entityManagerFactoryBe

当我在hibernate中使用allocationsize=10并在db中插入5条记录时,id将为1,2,3,4,5。当我重新启动服务器时,下一个插入id有5个间隙并从11,12,13开始,…有什么办法解决这个问题吗?在id中没有间隙很重要吗? 我搜索并设置

<prop key="hibernate.id.new_generator_mappings">true</prop>
spring.xml:

<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="brc.com"/><!--ToPackageAddress-->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <!--<prop key="hibernate.hbm2ddl.auto">create-drop</prop>-->
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.id.new_generator_mappings">true</prop>
        </props>
    </property>
</bean>

因此,在多次搜索之后,我得出结论,没有办法解决这个差距。每次我们重新启动web应用程序或服务器时,如果有分配的ID,它将使差距和顺序增加。 在对db的巨大插入中,最好将序列的分配大小设置为一个更大的数字,并忘记间隙,因为它在将来不会产生问题


在某些特定时刻,我们可以从db和java代码中获取最后一个id,以便将序列返回到最后一个id。但是,如果有许多事务会干扰返回序列,我们只能将分配大小设置为1,或者保存未使用的id,然后在某些代码中使用它们。

为什么您会关心序列中的间隔?无论如何,当读取序列的事务回滚下一个值时,您将得到它们。如果您需要该记录的序列值,你不应该依赖合成键来实现这一点。所以没有必要让ID是连续的?这个间隔以后不再重要了?请注意,数百万条记录将被插入到这个数据库中。不,你已经设置了一个最大值,我甚至无法将其输入文字,但让我们假设它没有那么长,假设它是32位,这将给你足够的空间容纳40多亿条记录(如果你只想要正数,则为20多亿条记录),或者64位,这可能会让你直到太阳系的热量耗尽。最坏的情况是,您最终会要求DBA在将来某个日期加宽列,当您处理数十亿行时,即使是数百万行也会产生轻微影响。
<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="brc.com"/><!--ToPackageAddress-->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <!--<prop key="hibernate.hbm2ddl.auto">create-drop</prop>-->
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.id.new_generator_mappings">true</prop>
        </props>
    </property>
</bean>
SEQUENCE C2 INCREMENT BY 10 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE;