我在这件事上浪费了太多时间...
我使用的是oracle,并且定义了一个以1为增量的序列(MY_TABLE_SEQ)。
在我的Pojo中我有:
@SequenceGenerator(name = "MY_SEQ", sequenceName="MY_TABLE_SEQ", allocationSize=50)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="MY_SEQ")这给了我一个独特的约束问题。根据我的理解,我需要设置以下属性:
hibernate.id.new_generator_mappings=true我已经尝试在我的hibernate.cfg.xml文件中设置,但似乎没有什么不同。我在persistance.xml中遇到过服务器post,但这是一个独立的应用程序,没有网络容器。
设置allocationSize=1是可行的,但当然它会在每次插入时命中db以获得下一个序列。设置上面的属性是为了解决这个问题。
发布于 2017-01-26 05:11:18
我还没有尝试过Oracle,但是我在插入AS400 DB2表时遇到了与您类似的问题。
我不得不删除DB2表中id列的标识标志--而是使用了一个自定义的jpa/hibernate序列生成器。这是在@ID实体字段的pojo/entity注释上设置的,就像您所做的那样。
DB2给了我关于缺少SYSIBM.SYSSEQUENCES表的错误,所以很明显hibernate (5.2版)不能识别原生DB2标识。自定义序列是一种有效的解决方法。
在@ID实体字段中:
@GeneratedValue(生成器=“表”,strategy=GenerationType.TABLE)
@TableGenerator(name = "table",allocationSize = 20)
此示例在每次查询表时分配一个包含20个序列号的池。
接下来,使用与hibernate5应用程序接口匹配的列创建所需的Hibernate needs表-必须小写...因此,在名称两边加引号,以解决DB2默认使用的自动大小写问题。如果这些名称是大写的,API将会出错。
表:"hibernate_sequences“
使用2列的示例:"sequence_next_hi_value“(整数,不可为空,默认为0) "sequence_name”(字符,样本长度为20,不可为空,自然为默认值)
在以编程方式使用的方言配置代码中- ex: Spring Boot,添加以下属性:
false(“false”,"false");properties.put("hibernate.id.new_generator_mappings",“properties.put”);
在*.properties文件中:
spring.jpa.properties.hibernate.dialect.supportsSequences=false spring.jpa.properties.hibernate.id.new_generator_mappings=false
数据库系统区分模式/表/字段名的大小写。还要注意到处都有打字错误,包括。属性名称。
确保您的pojo/实体只包含将映射到表的私有字段。像serialVersionUID这样的静态决赛是可以的。
我很快就会为SQL Server做一些类似的事情。
对于MySQL,我可以使用在表ID字段中定义的标识列来插入记录,因此不必进行所有这些更改。更简单的设置,因为hibernate可以识别MySQL中的标识。@GeneratedValue(strategy=GenerationType.IDENTITY)是pojo中所需的全部内容。
我是个新手,所以总是在寻找更好的方法...但现在这个方法起作用了。
发布于 2019-09-03 03:27:51
我在hibernate.cfg.xml文件中像这样设置了属性,它就可以工作了!
<property name="hibernate.jpa.compliance.global_id_generators" value="true"/>
https://stackoverflow.com/questions/41599916
复制相似问题