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
Какой для меня самый лучший и удобный способ сгенерировать идентификаторы? Я не хочу менять свою стратегию наследования.
hibernate
inheritance
jpa
class-table-inheritance
Мартейн Питерс
источник
источник
Интересно, связана ли это с конкретной проблемой диалекта базы данных, поскольку, просмотрев учебник на YouTube с PostgreSQL в качестве базовой базы данных, я увидел, что создатель видео успешно запустил приложение с @GeneratedValue по умолчанию. В моем случае (базовая база данных - MySQL) мне пришлось изменить стратегию @GeneratedValue на GenerationType.TABLE точно так, как предлагает zoidbeck.
Вот видео: https://www.youtube.com/watch?v=qIdM4KQOtH8
источник
GenerationType.SEQUENCE
. Поэтому там он работает автоматически. Это не имеет абсолютно ничего общего с PostgreSQLINHERITS
.Согласен с ответом Зойдбека. Вам необходимо изменить стратегию на:
@GeneratedValue(strategy = GenerationType.TABLE)
Но это еще не все, вам нужно создать новую таблицу, которая будет содержать последовательность первичных ключей вашей абстрактной таблицы. Измените свое сопоставление на
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator") @TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator") public long getConfirmationCode() { return confirmationCode; }
И новая таблица в базе данных должна выглядеть следующим образом:
Когда вы запускаете свое приложение, Hibernate вставит строку, в которой
sequence_name
будет имя объекта (SuperClass
в этом примере), аsequence_next_hi_value
значение будет автоматически увеличиваться и использоваться для новых записей всех реализующих таблиц подклассов.источник
В нашем случае мы используем базу данных PostreSQL для разработки и производства и базу данных hsqldb в памяти для тестов. В обоих случаях мы используем последовательность для генерации идентификатора. По-видимому, по
GenerationType.AUTO
умолчаниюSEQUENCE
для postgres, но не удалось в наших локальных тестах (по умолчанию должно быть что-то другое для hsqldb).Итак, решение, которое сработало для нас, явно использует
GenerationType.SEQUENCE
.источник
вы можете использовать @MappedSuperclass для наследования
источник
Между MySQL и PostgreSQL существует соответствие стандарту SQL. 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
источник