Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate架构参数不存在';t在@SequenceGenerator注释中工作_Hibernate_Postgresql_Schema_Sequence_Jpa 2.0 - Fatal编程技术网

Hibernate架构参数不存在';t在@SequenceGenerator注释中工作

Hibernate架构参数不存在';t在@SequenceGenerator注释中工作,hibernate,postgresql,schema,sequence,jpa-2.0,Hibernate,Postgresql,Schema,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 = "m

我有以下代码:

@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"
一切正常


我是否对模式参数的含义有误解,还是它是一个bug?你知道如何使模式参数工作吗?

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


您还可以为通过ALTER user连接到PostgreSQL的用户设置默认模式。。。设置SEARCH_PATH这听起来像个bug:JPA提供者应该尊重注释的“新”(自Java Persistence 2.0以来)和属性。我建议提高(注释和实体管理器项目现在在核心下),找不到任何现有项目。

您好,我也遇到了同样的问题

但是将hibernate.hbm2ddl.auto设置为更新并运行

<property name="hibernate.hbm2ddl.auto">update</property>
更新

这里也有同样的问题,在我看来像个bug。我正在使用hibernate 3.6.7 查看源代码,我看到一个方法
org.hibernate.cfg.annotations.reflection.jpaoverrideannotationreader#buildSequenceGeneratorAnnotation(Element Element)
,它似乎复制了
名称
序列名称
初始值
分配大小
属性的值,但我看不到对
目录
模式

我希望看到类似于方法
getTable(元素树,XMLContext.defaults)
(属于同一个类)的东西,它具有

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

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

因此,即使有点黑客行为,至少对于这个版本来说,方法似乎是在
sequenceName
前面加前缀。

尝试将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;

同样的问题,在Oracle Database 11g Enterprise Edition 11.2.0.1.0版上使用Hibernate 4.3.6.Final和Spring 4.1.4.RELEASE也会出现

看起来这是一个bug=>


我们通过在模式a中创建一个指向模式B中序列的同义词来解决这个问题。这个同义词是我们在@SequenceGenerator annotation的模式属性中使用的。我的解决方法如下(JPA 2.1,Hibernate 4.3.8.Final,PostgreSQL 9.4):


我在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;

请参见sequenceName前面的“sisbp”。sequenceName是“seq_area_tematica”,现在是“sisbp”(模式)+“seq_area_tematica”

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

@SequenceGenerator(name=“my_table_id_seq”,sequenceName=“my_schema.my_table_id_seq”,
schema=“my_schema”)
对于我想在会话中使用模式集的情况,我使用了
sequenceName
,没有预先设置模式

对于那些希望所有序列使用相同模式的人,可以使用
hibernate.default\u schema
属性。这样,您就无需更改
@SequenceGenerator
属性:

my\u schema\u name
我正在使用PostgreSQL数据库管理系统。如果您想在Hibernate调用
nextval(“我的序列”)
时动态更改序列的名称,您可以扩展数据库方言类并配置Hibernate以使用。您只需重写
getSequenceNextValString()
方法。向该方法提供的唯一信息是在
@SequenceGenerator
上定义的
sequenceName
属性:

公共类SchemaPostgreSqlDialogue扩展了PostgreSql82Dialogue{
@凌驾
公共字符串getSequenceNextValString(字符串sequenceName){
字符串seqFinalName=mySequenceNameModifierMethod(sequenceName);
返回“选择下一个(“”+seqFinalName+“)”;
}
私有字符串mySequenceNameModifierMethod(字符串原始SequenceName){
//这里有魔法修改
返回modifiedSequenceName;
}
}

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

在我的情况下,执行不会经过@jambriz指示的位置

版本:Hibernate 3.6.10.Final

persistence.xml
中的
hibernate.id.new\u generator\u mappings=false
时出现问题。当设置为
true
或仅删除时,Hibernate使用序列方案来构建SQL解决方案:


代码中的问题在哪里

在第445行和480行之间的类中。在
if
块的第455行,您可以看到正在设置的方案。在else中,未设置方案


希望这有帮助

将hibernate与spring一起使用时 请设定

<prop key="hibernate.id.new_generator_mappings">true</prop>
true

我在这里遇到了同样的问题,并像您一样将模式放在序列名上。我的@SequenceGenerator没有架构属性。我知道这是事后才知道的,但这个答案是不正确的,因为它只会在默认架构中创建生成器,而默认架构可能不是您想要的。据称在版本5.x中已修复:
<prop key="hibernate.id.new_generator_mappings">true</prop>