Основываясь на ваших последующих комментариях, вам нужно иметь идентификатор первичного ключа для Person
и уникальный идентификатор для Student
.Обратите внимание, что при текущей настройке только один из ключей может быть сгенерирован автоматически (многие СУБД допускают автоматическое увеличение только одного столбца на таблицу).Поэтому я бы рекомендовал вам сначала определить столбец первичного ключа для Person
:
@Entity
@Table(name="person")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING,length=20)
@DiscriminatorValue("P")
public class Person {
@Basic
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="personId")
private Long id;
}
Обратите внимание, что в вашей БД вы захотите использовать столбец personId в качестве автоинкремента.Затем определите отдельную сгенерированную аннотацию для чисел ваших студентов.В приведенном ниже примере используется генератор таблиц, но вы можете делать все, что захотите:
@Entity
@DiscriminatorValue("S")
public class Student extends Person {
@Basic
@TableGenerator(name="ID_GEN", table="identifier_table", pkColumnName="seq_name",
valueColumnName="seq_count", pkColumnValue="student_seq")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ID_GEN")
@Column(name = "studentNumber")
private Long studentNumber;
}
Здесь представлен DDL для таблицы, которая вам потребуется для поддержки генерации порядкового номера для студентов, как показано в примере выше:
create table identifier_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
seq_name VARCHAR(255) NOT NULL,
seq_count INT NOT NULL DEFAULT 0
);
И вы бы изначально заполнили его:
insert into identifier_table (seq_name, seq_count) VALUES ('student_seq', 0);
Конечно, более простым решением было бы объявить идентификатор вашего студента как String, тогда вы могли бы просто сделать следующее, гораздо прощеsetup:
public class Student extends Person {
@Basic
@NotNull
@Column(name = "studentId")
private String studentIdentifier;
}
И перед сохранением каждой записи установите идентификатор студента с помощью класса UUID:
aStudent.setStudentIdentifier(UUID.randomUUID().toString());
Надеюсь, это поможет.