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



我有两个实体personStudent,学生实体扩展了person,并有自己的标识符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吗?

根据您的后续评论,您希望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;
}

请注意,在您的DB中,您希望将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());

希望这能有所帮助。

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

最新更新