Невозможно использовать генерацию ключа столбца идентификатора с <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 для наследования