17

我有以下代码:

@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;

}

数据库:Postgresql 8.4,Hibernate annotations 3.5.0-Final。

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

select nextval('my_table_id_seq')

所以没有模式前缀,因此无法找到序列。当我写序列名时

sequenceName = "my_schema.my_table_id_seq"

一切正常。

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

4

11 回答 11

7

同样的问题,对我来说似乎是一个错误。我正在使用休眠 3.6.7 查看源代码,我看到一个方法org.hibernate.cfg.annotations.reflection.JPAOverridenAnnotationReader#buildSequenceGeneratorAnnotation(Element element)似乎复制了、和属性的值name,但我没有看到对或的引用sequence-nameinitial-valueallocation-sizecatalogschema

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

annotation.setValue("schema", table.schema());
annotation.setValue("catalog", table.catalog());` 

buildTableGeneratorAnnotation

copyStringAttribute(ad, element, "catalog", false);
copyStringAttribute(ad, element, "schema", false);

因此,即使有点骇人听闻,周围的方式 - 至少对于这个版本 - 似乎sequenceName就像你所说的那样作为前缀。

于 2012-01-10T00:09:58.320 回答
7

我的解决方法如下所示(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)
于 2015-09-02T13:49:19.467 回答
2

在这里使用 Hibernate4.2.0.Final并有同样的问题。看起来这是另一个用户回答的错误。我想对序列使用动态模式,具体取决于为会话设置的模式,但对于某些序列,我想使用public模式。所以对我来说,我不得不使用你提出的解决方案:将模式名称放在我想使用特定模式的序列名称上:

@SequenceGenerator(name = "my_table_id_seq", sequenceName="my_schema.my_table_id_seq",
 schema = "my_schema")

对于我想为会话使用模式集的情况,我使用了sequenceName没有预先设置模式的 。

对于那些希望所有序列都使用相同架构的人,您可以使用 hibernate.default_schema属性。有了它,您无需更改您的@SequenceGenerator属性:

<prop key="hibernate.default_schema">my_schema_name</prop>

我正在使用 PostgreSQL DBMS。如果您想在 Hibernate 调用时动态更改序列的名称,nextval('my_sequence')您可以扩展您的数据库方言类并配置 Hibernate 以使用。您只需要覆盖getSequenceNextValString()方法。提供给该方法的唯一信息是在sequenceName上定义的属性@SequenceGenerator

public class SchemaPostgreSQLDialect extends PostgreSQL82Dialect {
    @Override
    public String getSequenceNextValString(String sequenceName) {
        String seqFinalName = mySequenceNameModifierMethod(sequenceName);       
        return "select nextval('" + seqFinalName + "')";
    }

    private String mySequenceNameModifierMethod(String originalSequenceName) {
        // magic modification here
        return modifiedSequenceName;
    }
}

我没有使用最后一种方法来更改序列的名称,因为它似乎不太适合我的情况。

于 2019-05-24T01:50:13.150 回答
2

我在 postgresql 9.6 中解决了这个问题,只在序列名称之前添加我的模式,如下所示:

(before) sequence name: seq_area_tematica
(after) sequence name: sisbp.seq_area_tematica

及其作品。见代码:

@Id
@Column(name="seq_area_tematica")
@GeneratedValue(generator="sequence",strategy=GenerationType.SEQUENCE) 
@SequenceGenerator(name="sequence",sequenceName="sisbp.seq_area_tematica")
private Long id;

请参阅序列名称之前的“sisbp”。sequenceName 是“seq_area_tematica”,现在是“sisbp”(模式)+“seq_area_tematica”。

于 2018-06-19T16:58:39.307 回答
1

这听起来像是一个错误:JPA 提供者应该尊重注解的“新”(自 Java Persistence 2.0 起)schemacatalog属性。@SequenceGenerator我建议提出一个 Jira 问题(注释和实体管理器项目现在属于核心),找不到任何现有问题。

于 2010-04-11T15:08:33.277 回答
1

同样的问题,在 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 上使用 Hibernate 4.3.6.Final 和 Spring 4.1.4.RELEASE。

看起来这是一个错误 => https://hibernate.atlassian.net/browse/HHH-7232

我们通过在模式 A 中创建一个指向模式 B 中的序列的同义词来解决这个问题。这个同义词是我们在 @SequenceGenerator 注释的模式属性中使用的

于 2015-02-04T08:10:53.513 回答
0

嗯,我不怎么使用hibernate的内部,但是这里有一些信息:

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

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

于 2010-04-10T16:15:00.383 回答
0

尝试将 SequenceGenerator 注释从 POJO 的类声明移动到id字段声明。使用 Hibernate 3.6.4 这个

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

}

为 MySQL 生成这个

create table my_schema.my_table_id_seq (
     next_val bigint 
);

insert into my_schema.my_table_id_seq values ( 1 );

这对于 PostgreSQL

create sequence my_schema.my_table_id_seq start 1 increment 50;
于 2013-10-09T18:16:16.383 回答
0

当使用带弹簧的休眠时,请设置

<prop key="hibernate.id.new_generator_mappings">true</prop>
于 2020-09-22T05:59:32.160 回答
0

就我而言,执行不会通过@jambriz 指示的位置。

版本:休眠 3.6.10.Final

问题出现hibernate.id.new_generator_mappings = falsepersistence.xml. 当设置为true或简单地删除时,Hibernate 使用序列方案来构建 SQL。解决方案:

<property name="hibernate.id.new_generator_mappings" value="true" />
<!-- Or remove this property -->

代码的问题在哪里?

在第445 行和第 480 行之间的AnnotationBinder.javaif类中。在第455 行的块中,您可以看到正在设置的方案。在 else 中没有设置方案。

希望这可以帮助!

于 2020-05-19T02:18:35.467 回答
-5

你好我有同样的问题

但是将您的 hibernate.hbm2ddl.auto 设置为更新和运行。

<property name="hibernate.hbm2ddl.auto">update</property>
于 2011-03-31T00:58:42.473 回答