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>