主键的生成策略
主键的生成策略 <generator>的取值可以为: 1、 increment:用于long,short或者int类型生成的唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不要使用 2、 identity:返回的标识符是long,short或者int类型。对DB2,MS SQL Service,Sybase和HypersonicSQL的内置标识符字段提供支持 3、 sequence:在DB2,PostgreSQL,Oracle,SAPDB,McKOI中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long,short或者int类型的 4、 hilo、seqhilo:使用一个高/低位算法高效的生成long,short或者int类型的标识符 5、 uuid:用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串 6、 guid:在MS SQL Server和MySQL中使用数据库生成的GUID字符串 7、 native:根据底层数据库的能力选择identity,sequence或者hilo中的一个 8、 assigned:让应用程序在save()之前为对象分配一个标示符。这是<generator>元素没有指定时的默认的生成策略。 9、 select:通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键 10、foreige:使用另一个相关联的对象的标识符。通常和<ont-to-one>联合起来使用 11、sequence-indentity:一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3的getGeneratedKeys结合在一起,使得在插入语句执行的时候返回生成的值。 1、2、7可以用于mySQL 3、4、5、6、9用于MySQL时会抛异常 注:验证时用于sql的情况均为直接配置,如: <generator class=”native”></generator> 3的异常: org.hibernate.MappingException:Could not instantiate id generator[entity-name=com.csdn.products.domain.Customers] at org.hibernate.id.factory.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:118) atorg.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:193) atorg.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:248) atorg.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) at com.csdn.products.juint.Demo.test(Demo.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) atorg.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) atorg.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) atorg.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) atorg.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) atorg.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) atorg.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by:org.hibernate.MappingException: org.hibernate.dialect.MySQLInnoDBDialect doesnot support sequences at org.hibernate.dialect.Dialect.getSequenceNextValString(Dialect.java:603) atorg.hibernate.id.SequenceGenerator.configure(SequenceGenerator.java:101) atorg.hibernate.id.factory.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:111) ... 26 more 9的异常: org.hibernate.id.IdentifierGenerationException:no natural-id property defined; need to specify [key] in generator parameters atorg.hibernate.id.SelectGenerator.determineNameOfPropertyToUse(SelectGenerator.java:73) at org.hibernate.id.SelectGenerator.access$100(SelectGenerator.java:52) atorg.hibernate.id.SelectGenerator$SelectGeneratorDelegate.<init>(SelectGenerator.java:117) atorg.hibernate.id.SelectGenerator$SelectGeneratorDelegate.<init>(SelectGenerator.java:98) at org.hibernate.id.SelectGenerator.getInsertGeneratedIdentifierDelegate(SelectGenerator.java:64) atorg.hibernate.persister.entity.AbstractEntityPersister.postConstruct(AbstractEntityPersister.java:3175) atorg.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:439) atorg.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84) atorg.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) at com.csdn.products.juint.Demo.test(Demo.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) atorg.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) atorg.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) atorg.junit.runners.ParentRunner.access$000(ParentRunner.java:42) atorg.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) atorg.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) atorg.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- File opened that is not a database file file is encrypt
- c# – 使用ASP.NET核心1.0的Resharper可编译性问题
- Cocos2d-x::截图保存、CCArray
- sqlite 在 android中使用注意事项
- [视频教程] 聚合数据 iOS 项目开发实战:条码查询器
- xml – 使用xpath获取节点的第N个子节点
- React Native ref高级用法&&setNativeProps使用
- 使用jQuery和ajax代替iframe的方法(详解)
- oracle ? 11g 诊断文件
- ruby-on-rails – Resque没有获取Redis配置设置