#java #hibernate #primary-key
Вопрос:
Я пытаюсь выяснить различные типы генерации первичных ключей для классов, которые наследуются от суперкласса, я использую встроенную базу данных H2, данные хранятся в файле. Все работало хорошо, объекты, которые я ранее создавал вручную в базе данных, были загружены, но когда я попытался сохранить новую сущность с помощью Hibernate, я получил ошибку
Таблица «ID_GENERATOR» не найдена.
Интересно, должен ли я создать таблицу для генератора таблиц «ID_GENERATOR» вручную? Я думал, что Hibernate создает его автоматически
Вот мой суперкласс:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class FundEvent implements Comparable<FundEvent>{
@Id
@TableGenerator(name = "id_generator")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "id_generator")
protected int id;
@Column(name = "amount")
protected int amount;
@Column(name = "deadline")
protected Date deadline;
@ManyToOne
@JoinColumn(name = "user_id")
protected User user;
//getters and setters
А вот объект класса сущности, который я пытаюсь сохранить:
@Entity
@Table(name = "purchases")
public class Purchase extends FundEvent{
@Column(name = "goal")
private String goal;
@Column(name = "bought")
private boolean bought;
@Column(name = "removed")
private boolean removed;
@Transient
private int activeAmount;
//getters and setters
Я что-то пропустил?
UPD: Вот мой hibernate.cfg.xml. Обратите внимание, я не использую весну, просто спящий режим
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="connection.driver_class">org.h2.Driver</property>
<property name="connection.url">jdbc:h2:file:/home/vetal22331122/data_for_purch</property>
<property name="connection.username"></property>
<property name="connection.password"></property>
<!-- JDBC connection pool settings ... using built-in test pool -->
<property name="connection.pool_size">2</property>
<!-- Select our SQL dialect -->
<property name="dialect">org.hibernate.dialect.H2Dialect</property>
<!-- Echo the SQL to stdout -->
<property name="show_sql">true</property>
<!-- Set the current session context -->
<property name="current_session_context_class">thread</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">none</property>
<!-- dbcp connection pool configuration -->
<property name="hibernate.dbcp.initialSize">5</property>
<property name="hibernate.dbcp.maxTotal">20</property>
<property name="hibernate.dbcp.maxIdle">10</property>
<property name="hibernate.dbcp.minIdle">5</property>
<property name="hibernate.dbcp.maxWaitMillis">-1</property>
<mapping class="entities.Purchase"/>
<!--<mapping class="entities.Payment"/>-->
<mapping class="entities.User"/>
</session-factory>
</hibernate-configuration>
Комментарии:
1. Какую конфигурацию приложения вы используете? можете ли вы поделиться приложением.свойства persitance.xml?
2. Я добавил hibernate.cfg.xml
Ответ №1:
Javadoc TableGenerator, показывающий пример, заполненный почти всеми свойствами, попробуйте заполнить каждое свойство аннотации и запустите снова: https://docs.oracle.com/javaee/6/api/javax/persistence/TableGenerator.html
Комментарии:
1. Я пробовал, результат тот же. Кроме того, все свойства, кроме имени, являются необязательными. Итак, Hibernate ДОЛЖЕН создать таблицу для генератора таблиц самостоятельно, верно? Имеет ли моя проблема какое-то отношение к тому факту, что поле идентификатора находится в суперклассе? Вот полное исключение: 05 сентября 2021 11:01:44 ВЕЧЕРА org.hibernate.id.улучшено. TableGenerator$1$1 ОШИБКА выполнения: HHH000351: Не удалось прочитать или ввести значение hi org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица «ID_GEN» не найдена; Инструкция SQL: выберите табл. Значение GEN_ из ID_GEN tbl, где tbl. GEN_KEY=? для обновления [42102-200]
2. На самом деле это может быть, из-за используемой вами стратегии, насколько я помню, генераторы идентификаторов составляют 1 на таблицу, и здесь вы пытаетесь иметь 1 на 2 таблицы.. работает ли это, если вы удалите подкласс?