在哪里设置hibernate.id.new_generator_mappings属性?

时间:2017-01-11 20:13:46

标签: java hibernate

我浪费了太多时间......

我正在使用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可以正常工作,但当然它会在每次插入时命中数据库以获得下一个序列。设置上述属性是为了解决它。

2 个答案:

答案 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>