Невозможно использовать генерацию ключей столбцов идентификаторов с помощью (таблица для каждого класса)
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 ответов:
проблема здесь в том, что вы смешиваете наследование "table-per-class" и
GenerationType.Auto
. Рассмотрим столбец идентификаторов в MsSQL. Это столбец на основе. В стратегии "таблица на класс" вы используете одну таблицу на класс, и каждый из них имеет идентификатор.попробуй:
@GeneratedValue(strategy = GenerationType.TABLE)
интересно, если это диалект базы данных конкретной проблемы, так как смотреть учебник youtube с PostgreSQL в качестве базовой базы данных я видел, что создатель видео запустить успешно приложение с по умолчанию @GeneratedValue. В моем случае (базовая база данных-MySQL) мне пришлось изменить стратегию @GeneratedValue на GenerationType.Таблица точно так, как предлагает зойдбек.
в нашем случае мы используем базу данных 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; }
и новая таблица в базе данных должна выглядеть следующим образом:
когда вы запустили приложение, 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