Параметр схемы Hibernate не работает в аннотации @SequenceGenerator - PullRequest
15 голосов
/ 09 апреля 2010

У меня есть следующий код:

@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 3.5.0-Final.

При сохранении объекта MyClass генерируется следующий SQL-запрос:

select nextval('my_table_id_seq')

Таким образом, префикс схемы отсутствует, и поэтому последовательность не может быть найдена. Когда я пишу имя последовательности, как

sequenceName = "my_schema.my_table_id_seq"

все работает.

Есть ли у меня недопонимание относительно значения параметра схемы или это ошибка? Есть идеи, как заставить работать параметр схемы?

Ответы [ 9 ]

7 голосов
/ 10 января 2012

Та же проблема здесь, для меня это похоже на ошибку. Я использую Hibernate 3.6.7 Глядя на исходный код, я вижу метод org.hibernate.cfg.annotations.reflection.JPAOverridenAnnotationReader#buildSequenceGeneratorAnnotation(Element element), который, кажется, копирует значения атрибутов name, sequence-name, initial-value и allocation-size, но не вижу ссылки на catalog или schema

я ожидал увидеть что-то аналогичное методу 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.

5 голосов
/ 02 сентября 2015

Мой обходной путь выглядит следующим образом (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)
1 голос
/ 19 июня 2018

Я решил эту проблему в 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. Имя sequenceName было "seq_area_tematica" и теперь является "sisbp" (схема) + "seq_area_tematica"

1 голос
/ 04 февраля 2015

Та же проблема, при использовании Hibernate 4.3.6.Final, с Spring 4.1.4.RELEASE, в Oracle Database 11g Enterprise Edition Release 11.2.0.1.0.

Похоже, это ошибка => https://hibernate.atlassian.net/browse/HHH-7232

Мы обошли проблему, создав синоним в схеме A, указывающий на последовательность в схеме B. Этот синоним был тем, что мы использовали в атрибуте схемы аннотации @SequenceGenerator

1 голос
/ 11 апреля 2010

Это звучит как ошибка: провайдер JPA должен соблюдать «новый» (начиная с Java Persistence 2.0) schema и catalog атрибутов @SequenceGenerator аннотация. Я предлагаю поднять проблему Jira (аннотации и проекты менеджера сущностей теперь находятся под ядром), не могу найти ни одного существующего.

0 голосов
/ 24 мая 2019

Использование Hibernate 4.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. Если вы хотите динамически изменить имя последовательности, когда 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;
    }
}

Я не использовал этот последний способ для изменения названия последовательностей, потому что он кажется менее подходящим для моего случая.

0 голосов
/ 09 октября 2013

Попробуйте переместить аннотацию 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;
0 голосов
/ 31 марта 2011

Здравствуйте, у меня была такая же проблема

но настройте hibernate.hbm2ddl.auto для обновления и запуска.

<property name="hibernate.hbm2ddl.auto">update</property>
0 голосов
/ 10 апреля 2010

Хммм, я не очень много работаю с внутренностями hibernate, но здесь есть некоторая информация:

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

Вы также можете установить схему по умолчанию для пользователя, подключающегося к PostgreSQL через ALTER USER ... SET SEARCH_PATH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...