为SINGLE_TABLE继承模型自动生成person_id和student_id

时间:2012-01-07 23:23:46

标签: java jpa persistence eclipselink auto-generate

我有两个实体personStudent,学生实体扩展了人,并拥有自己的标识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;
}

这是我创建一个新学生的地方,并且生成了学生编号,但是人格不是?

    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 :(得分:0)

根据您的后续评论,您希望拥有Person的主键标识符和Student的唯一标识符。请注意,对于当前设置,只能自动生成其中一个键(许多DBMS只允许每个表一列自动递增)。因此,我建议您先为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,然后您可以执行以下操作,更容易设置:

public class Student extends Person {
    @Basic
    @NotNull
    @Column(name = "studentId")
    private String studentIdentifier;
}

在保存每条记录之前,请使用UUID类设置学生ID:

aStudent.setStudentIdentifier(UUID.randomUUID().toString());

希望这有帮助。

答案 1 :(得分:0)

我认为你目前只能拥有一个GenerateValue。如果你想要两个,你需要不使用继承,即Person有一个1-1到StudentInfo,或者你可以在一个事件或你的应用程序中分配另一个id。 EclipseLink Session上有一个API来获取新生成的id。