gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:32:23 25 4
gpt4 key购买 nike

我有两个实体personStudent,student实体扩展了person并且有自己的标识符studentNumber。创建新学生时,我想自动生成两个标识号。

以下代码片段失败并显示:person_id is 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;
}

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

当然,更简单的解决方案是将您的学生标识符声明为字符串,然后您可以执行以下操作,更容易设置:

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

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

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

希望这有帮助。

关于java - 为SINGLE_TABLE继承模型自动生成person_id和student_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com