我有两个实体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;
}
这是我创建一个新学生的地方,并且生成了学生编号,但是人格不是?
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吗?
答案 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。