Нужно ли мне самостоятельно создавать таблицу для Hibernate TableGenerator?

#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 таблицы.. работает ли это, если вы удалите подкласс?