Hibernate架构参数在@SequenceGenerator注释中不起作用

tab*_*lin 15 postgresql schema hibernate sequence jpa-2.0

我有以下代码:

@Entity
@Table(name = "my_table", schema = "my_schema")
@SequenceGenerator(name = "my_table_id_seq", sequenceName = "my_table_id_seq", 
                   schema = "my_schema")
public class MyClass {
    @Id
    @GeneratedValue(generator = "my_table_id_seq", 
                    strategy = GenerationType.SEQUENCE)
    private int id;

}
Run Code Online (Sandbox Code Playgroud)

数据库:Postgresql 8.4,Hibernate注释3.5.0-最终版.

保存MyClass的对象时,它会生成以下SQL查询:

select nextval('my_table_id_seq')
Run Code Online (Sandbox Code Playgroud)

因此没有模式前缀,因此无法找到序列.当我写sequenceName之类的时候

sequenceName = "my_schema.my_table_id_seq"
Run Code Online (Sandbox Code Playgroud)

一切正常.

我对架构参数的含义有误解吗?还是一个错误?任何想法如何使架构参数工作?

jam*_*riz 7

这里的问题一样,对我来说就像一个bug.I'm使用Hibernate 3.6.7查看源代码,我看到了一个方法org.hibernate.cfg.annotations.reflection.JPAOverridenAnnotationReader#buildSequenceGeneratorAnnotation(Element element),似乎要复制的值name,sequence-name,initial-valueallocation-size属性,但我看不出有任何引用catalogschema

我希望看到类似于getTable(Element tree, XMLContext.Default defaults)(同一类的)方法的东西

annotation.setValue("schema", table.schema());
annotation.setValue("catalog", table.catalog());` 
Run Code Online (Sandbox Code Playgroud)

buildTableGeneratorAnnotation哪个

copyStringAttribute(ad, element, "catalog", false);
copyStringAttribute(ad, element, "schema", false);
Run Code Online (Sandbox Code Playgroud)

因此,即使有点hackish,至少这个版本的方式 - 似乎是sequenceName正如你所说的那样.


小智 5

我的解决方法看起来像这样(JPA 2.1,Hibernate 4.3.8.Final,PostgreSQL 9.4):

@SequenceGenerator(name = "seq_name", sequenceName = "my_schema.seq_name", schema = "my_schema", allocationSize = 1, initialValue = 1)
Run Code Online (Sandbox Code Playgroud)


小智 0

嗯,我不太了解休眠的内部结构,但这里有一些信息:

https://forum.hibernate.org/viewtopic.php?p=2406761

您还可以通过 ALTER USER ... SET SEARCH_PATH 为连接到 PostgreSQL 的用户设置默认架构