jpa 如何在Eclipselink中选择性地持久化辅助表

xytpbqjk  于 2022-11-30  发布在  Eclipse
关注(0)|答案(2)|浏览(114)

我正在使用Eclipselink,在使用辅助表时遇到了问题。我有两个表,如下所示。
1.具有student_id(主键)、student_name等列的学生
1.使用student_id(与Student表的FK关系)、course_name(具有非空约束条件)等列进行注册
要求是学生可以注册,也可以不注册。如果学生注册,则还应将数据持久化到Registration表。否则,只应持久化Student表。
我的代码片段如下。

Student.java
------------

@Entity
@Table(name = "STUDENT")
@SecondaryTable(name = "REGISTRATION")

@Id
@Column(name = "STUDENT_ID")
private long studentId;

@Basic(optional=true)
@Column(name = "COURSE_NAME", table = "REGISTRATION")
private String courseName;

我尝试了以下方案。1.已注册的学生-工作正常。将数据添加到“学生”表和“注册”表中2.未注册的学生-获取错误,例如“课程名称”不能为空。
是否有办法防止持久化到辅助表中?
任何帮助都是非常感谢的。
谢谢!!!

f45qwnt8

f45qwnt81#

正如@Eelke所说,最好的解决方案是定义两个类和一对一关系。
您也可以使用继承,让一个Student和一个RegisteredStudent添加额外的表,但关系是一个更好的设计。

4ngedf3f

4ngedf3f2#

可以使用DescriptorEventListener。aboutToInsert和aboutToUpdate回调可以访问DatabaseCalls,甚至可以删除命中辅助表的语句。
使用实体的ClassDescriptor注册DescriptorEventListener。若要注册,请使用实体的Customizer注解中指定的DescriptorCustomizer。
但是,您稍后将无法成功地取回实体。EclipseLink在从辅助表中进行选择时使用内部连接,因此主表的行将不在结果中。

相关问题