我浪费了太多时间......
我正在使用oracle并且我定义了一个序列(MY_TABLE_SEQ),其增量为1.
在我的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中,但这是一个独立的应用程序,没有webcontainer。
设置allocationSize = 1可以正常工作,但当然它会在每次插入时命中数据库以获得下一个序列。设置上述属性是为了解决它。
答案 0 :(得分:0)
我没有尝试过Oracle,但是我在插入AS400 DB2表时遇到了类似的问题。
我必须删除DB2表上id列上的identity标志 - 而是使用自定义jpa / hibernate序列生成器。这是在你完成的@ID实体字段的pojo / entity注释上设置的。
DB2一直在给我提供有关缺少SYSIBM.SYSSEQUENCES表的错误,因此显然hibernate(版本5.2)无法识别本机DB2标识。自定义序列是有效的解决方法。
在@ID实体字段:
@GeneratedValue(generator =“table”,strategy = GenerationType.TABLE)
@TableGenerator(name =“table”,allocationSize = 20)
此示例在每次查询表时分配一个包含20个序列号的池。
接下来,使用与hibernate5 API匹配的列创建Hibernate所需的表 - 必须是小写的...所以在名称周围加上引号以解决DB2默认的自动上层大小写。如果这些名称是大写的,API将会出错。
表: “hibernate_sequences”
使用的2列示例: “sequence_next_hi_value”(整数,不可为空,默认为0) “sequence_name”(字符,样本长度20,不可为空,默认为自然)
在所使用的方言的配置代码中 - 例如:Spring Boot,以编程方式添加这些属性:
properties.put( “hibernate.supportsSequences”, “假”); properties.put( “hibernate.id.new_generator_mappings”, “假”);
并在* .properties文件中:
spring.jpa.properties.hibernate.dialect.supportsSequences =假 spring.jpa.properties.hibernate.id.new_generator_mappings =假
数据库系统对模式/表/字段名称区分大小写。还要注意到处都是拼写错误,包括财产名称。
确保您的pojo / entity仅包含将映射到表的私有字段。诸如serialVersionUID之类的静态终结是可以的。
我很快会为SQL Server做类似的事情。
对于MySQL,我没有使用表ID字段中定义的标识列插入记录的问题,因此不必进行所有这些更改。一个更简单的设置,因为hibernate识别MySQL中的身份标识。 @GeneratedValue(策略= GenerationType.IDENTITY) 这就是pojo所需要的一切。
我是这方面的新手,所以一直在寻找更好的方法......但这一点现在起作用了。
答案 1 :(得分:0)
我在hibernate.cfg.xml文件中设置了这样的属性,它可以正常工作!
<property name="hibernate.id.new_generator_mappings"> value="true"</property>