Использование 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;
}
}
Я не использовал этот последний способ для изменения названия последовательностей, потому что он кажется менее подходящим для моего случая.