我有两个实体person
和Student
,学生实体扩展了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。