Автоматическая генерация person_id и student_id для модели наследования SINGLE_TABLE - PullRequest
1 голос
/ 08 января 2012

У меня есть две сущности person и Student, ученическая сущность расширяет личность и имеет свой собственный идентификатор studentNumber.При создании нового студента я хочу автоматически сгенерировать оба идентификационных номера.

Следующий фрагмент не работает с: person_id, являющимся NULL

@RooEntity(identifierColumn = "personID", inheritanceType = "SINGLE_TABLE")
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
@DiscriminatorValue("P")
public class Person {
}

Сущность студента

@RooEntity
@DiscriminatorValue("S")
public class Student extends Person {


    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "studentNumber") 
    private long studentNumber;
}

Здесь я создаю нового студента и номер студентагенерируется, но personid нет?

    private Student student;

    /**
     * @method Create a new student using our persistence model---Not Null variables
     */

    public void CreateNewStudent(String firstName, String lastName, String telephone, Date birthday, GenderType gender){


        student = new Student();
        //set our variables and persist
        student.setFirstName(firstName);
        student.setLastName(lastName);
        student.setTelephone(telephone);
        student.setBirthDay(birthday);
        student.setGender(gender);

        student.persist();
    }
}

Есть ли способ, как я могу создать и studentNumber, и personID при создании студента?

Ответы [ 2 ]

0 голосов
/ 09 января 2012

Я думаю, у вас может быть только одно GenerateValue Если вам нужно два, вам либо не нужно использовать наследование, т. Е. Person имеет 1-1 для StudentInfo, либо вы можете назначить другой идентификатор в событии или из вашего приложения. В сеансе EclipseLink имеется API для получения нового сгенерированного идентификатора.

0 голосов
/ 08 января 2012

Основываясь на ваших последующих комментариях, вам нужно иметь идентификатор первичного ключа для 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());

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...