Невозможно использовать генерацию ключей столбцов идентификаторов с помощью (таблица для каждого класса)


com.что-то.Суперкласс:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
    private static final long serialVersionUID = -695503064509648117L;

    long confirmationCode;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
    public long getConfirmationCode() {
        return confirmationCode;
    }

    public void setConfirmationCode(long confirmationCode) {
        this.confirmationCode = confirmationCode;
    }
}

com.что-то.Подкласс:

@Entity
public abstract class Subclass extends SuperClass {
    private static final long serialVersionUID = 8623159397061057722L;

    String name;

    @Column(nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

дает мне это исключение:

Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass

что является лучшим и наиболее удобным способом для меня, чтобы генерировать идентификаторы? я не хочу менять свою стратегию наследования.

6 79

6 ответов:

проблема здесь в том, что вы смешиваете наследование "table-per-class" и GenerationType.Auto. Рассмотрим столбец идентификаторов в MsSQL. Это столбец на основе. В стратегии "таблица на класс" вы используете одну таблицу на класс, и каждый из них имеет идентификатор.

попробуй:

@GeneratedValue(strategy = GenerationType.TABLE)

интересно, если это диалект базы данных конкретной проблемы, так как смотреть учебник youtube с PostgreSQL в качестве базовой базы данных я видел, что создатель видео запустить успешно приложение с по умолчанию @GeneratedValue. В моем случае (базовая база данных-MySQL) мне пришлось изменить стратегию @GeneratedValue на GenerationType.Таблица точно так, как предлагает зойдбек.

вот видео:https://www.youtube.com/watch?v=qIdM4KQOtH8

в нашем случае мы используем базу данных PostreSQL для разработки и производства и базу данных hsqldb в памяти для тестов. Мы используем последовательность в обоих случаях для создания идентификатора. Видимо GenerationType.AUTO по умолчанию SEQUENCE для postgres, но не удалось в наших локальных тестах (по умолчанию должно быть что-то еще для hsqldb).

Так что решение, которое работало для нас, явно использовать GenerationType.SEQUENCE.

согласен с ответом зойдбека. Вам нужно изменить стратегию на:

@GeneratedValue(strategy = GenerationType.TABLE)

но это еще не все, вам нужно создать новую таблицу, которая будет содержать последовательность первичных ключей таблицы вашего абстракта. Измените отображение на

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator")
@TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator")
public long getConfirmationCode() {
   return confirmationCode;
}

и новая таблица в базе данных должна выглядеть следующим образом: enter image description here

когда вы запустили приложение, Hibernate вставит строку, где sequence_name будет имя сущности (SuperClass в этом примере) и sequence_next_hi_value значение будет автоматически увеличивается и используется для новых записей таблиц всех реализующих подклассов.

существует соответствие стандарту SQL между MySQL и PostgreSQL. PostgreSQL Postgres понимает хорошее подмножество SQL92 / 99 плюс некоторые объектно-ориентированные функции для этих подмножеств. Postgres способен обрабатывать сложные процедуры и правила в виде декларативных SQL-запросов, подзапросов, представлений, многопользовательской поддержки, транзакций, оптимизации запросов, наследования и массивов. Не поддерживает выбор данных между различными база данных.

MySQL MySQL использует SQL92 в качестве своей основы. Работает на многих платформах. Mysql может создавать запросы, которые могут объединять таблицы из разных баз данных. Поддерживает как левые, так и правые внешние соединения с использованием синтаксиса ANSI и ODBC. Начиная с MySQL 4.1 с этого выпуска MySQL будет обрабатывать подзапросы. Вид поддерживаются с версии 5.

для детального описания пожалуйста посещать. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html

вы можете использовать @MappedSuperclass для наследования