Невозможно использовать генерацию ключа столбца идентификатора с <union-subclass> (TABLE_PER_CLASS)

com.something.SuperClass:

@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.something.SubClass:

@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

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

Ответ 1

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

Try:

@GeneratedValue(strategy = GenerationType.TABLE)

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Согласитесь с ответом zoidbeck. Вам необходимо изменить стратегию:

@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 будет автоматически увеличиваться и использоваться для новых записей всех таблиц реализующих подклассов.

Ответ 5

Существует стандартное соответствие 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

Ответ 6

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