Ответ 1
Вам нужно установить Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>
.. см. и ссылку.
Для более старой версии hibernate 4.x:
<prop key="hibernate.id.new_generator_mappings">false</prop>
Я попытался обновить спящий режим с 4 до 5 в моем проекте с помощью spring 4.2
. После этого обновления я обнаружил следующую ошибку в трассировке стека, когда я вызвал метод для обновления.
10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist
Я изменил автоматически увеличивающийся идентификатор с аннотацией
@GeneratedValue(strategy=GenerationType.AUTO)
по-прежнему сохраняется ошибка.
Вам нужно установить Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>
.. см. и ссылку.
Для более старой версии hibernate 4.x:
<prop key="hibernate.id.new_generator_mappings">false</prop>
Вы также можете поставить:
@GeneratedValue(strategy = GenerationType.IDENTITY)
И пусть DateBase управляет инкрементацией первичного ключа:
AUTO_INCREMENT PRIMARY KEY
Работа с Spring Boot
Поместите строку ниже в .application.properties
spring.jpa.properties.hibernate.id.new_generator_mappings=false
В Hibernate 4.X этот атрибут по умолчанию имеет значение true
.
Это причина этой ошибки:
Он будет искать, как база данных, которую вы используете, генерирует идентификаторы. Для MySql или HSQSL есть дополнительные поля, которые автоматически увеличиваются. В Postgres или Oracle они используют таблицы последовательностей. Поскольку вы не указали имя таблицы последовательностей, он будет искать таблицу последовательностей с именем hibernate_sequence и использовать ее по умолчанию. Таким образом, у вас, вероятно, нет такой таблицы последовательности в вашей базе данных, и теперь вы получите эту ошибку.
Я получаю ту же ошибку "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: таблица" mylocaldb.hibernate_sequence "не существует".
Используя Spring Mvc 4.3.7 и Hibernate версии 5.2.9, приложение сделано с использованием конфигурации Spring Java. Теперь я должен добавить свойство hibernate.id.new_generator_mappings
упомянутое @Eva Mariam, в моем коде так:
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.addProperties(getHibernateProperties());
sessionBuilder.addAnnotatedClasses(User.class);
return sessionBuilder.buildSessionFactory();
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
properties.put("hibernate.id.new_generator_mappings","false");
return properties;
}
И это сработало как шарм.
FYI
Если вы используете файлы hbm для определения отображения O/R.
Обратите внимание:
В Hibernate 5, имя параметра для имени последовательности было изменено.
Следующий параметр работал в Hibernate 4:
<generator class="sequence">
<param name="sequence">xxxxxx_seq</param>
</generator>
Но в Hibernate 5 тот же файл настроек сопоставления приведет к ошибке "hibernate_sequence не существует".
Чтобы исправить эту ошибку, имя параметра должно изменить на:
<generator class="sequence">
<param name="sequence_name">xxxxxx_seq</param>
</generator>
Эта проблема потратила на меня 2, 3 часа.
И каким-то образом это выглядит как без документа.
Мне нужно прочитать исходный код org.hibernate.id.enhanced.SequenceStyleGenerator, чтобы понять его
в hibernate 5.x вы должны добавить set hibernate.id.new_generator_mappings в false в hibernate.cfg.xml
<session-factory>
......
<property name="show_sql">1</property>
<property name="hibernate.id.new_generator_mappings">false</property>
......
</session-factory>
Когда вы используете
@GeneratedValue(strategy=GenerationType.AUTO)
или же
@GeneratedValue
что является коротким путем вышеупомянутого, Hibernate начинает выбирать лучшую стратегию генерации для вас, в этом случае он выбрал
GenerationType.SEQUENCE
как стратегия и именно поэтому она ищет
schemaName.hibernate_sequence
которая является таблицей, для генерации идентификатора на основе последовательности.
Когда вы используете GenerationType.SEQUENCE
в качестве стратегии, вам необходимо предоставить @TableGenerator
следующим образом.
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
@TableGenerator(name = "user_table_generator",
table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE")
@Column(name = "USER_ID")
private long userId;
Когда вы устанавливаете стратегию
@GeneratedValue(strategy = GenerationType.IDENTITY)
.
Первоначальная проблема была решена, потому что тогда Hibernate перестал искать таблицу последовательности.
На тот случай, если кто-то решит эту проблему, как я сделал это сегодня, я не смогу устранить эту ошибку, пока не изменился.
spring.jpa.hibernate.dll-auto=create
в
spring.jpa.properties.hibernate.hbm2ddl.auto=create
Я использую Spring Boot
и я исправил это, добавив следующую строку в файл application.properties
:
spring.jpa.properties.hibernate.id.new_generator_mappings = false
Вы также можете поставить:
@GeneratedValue(strategy = GenerationType.IDENTITY)
И пусть DateBase управляет приращением первичного ключа:
AUTO_INCREMENT PRIMARY KEY
Приведенный выше ответ помог мне.
Это может быть вызвано HHH-10876, которое было исправлено, поэтому убедитесь, что вы обновили:
Я добавил последовательность Hibernate в postgres. Запустите этот запрос в PostGres Editor:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
Я выясню плюсы и минусы использования запроса, но для тех, кто нуждается в помощи, может использовать это.
В моем случае замена всех аннотаций GenerationType.AUTO
на GenerationType.SEQUENCE
решила проблему.
Запустите этот запрос
create sequence hibernate_sequence start with 1 increment by 1