我正在使用Hibernate构建一个应用程序。我使用的是一个数据库模式,其中包含两个名为assignment
和assignment_type
的表。后者包含描述assignment
类型的主键/值对(例如"书面"、"实用")。
然而,assignment
是由written_assignment
和practical_assignment
这样的类扩展的抽象类。为此,我使用类表继承方法(有关主题的一些详细信息)。
现在,在创建written_assignment
之类的类的实例期间,在assignment_type
中设置对适当对象的引用是有意义的,类似于以下内容:
public WrittenAssignment() {
AssignmentType assignmentType = ...; // Create or acquire appropriate instance
this.setAssignmentType(assignmentType);
}
据我所知,使用"创建实例"方法只会起一次作用,那一次是数据库中还没有具有该值的对象时的状态(因为assignment_type
表的值被设置为唯一的)。
有没有一种方法可以在WrittenAssignment
的构造函数中设置对assignment_type
对象的引用,而无需首先获取它?额外的问题:如果还没有匹配的对象,它能被创建吗?
您可以使用引用assignment
表中assignment_type
表的列作为鉴别器列,然后将AssignmentType
关系映射为只读@ManyToOne
,将insertable
和updatable
设置为false
。
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="ASSIGNMENT_TYPE_ID")
@Table(name="assignment")
public abstract class Assignment {
...
@ManyToOne
@JoinColumn(name = "ASSIGNMENT_TYPE_ID", insertable = false, updatable = false)
private AssignmentType assignmentType;
}
在子类中,放置具有@DiscriminatorValue
注释的适当鉴别器列值:
@Entity
@DiscriminatorValue("W")
@Table(name="written_assignment")
public class WrittenAssignment extends Assignment {
...
}
当您需要创建一个新的子实体时,请使用构造函数,并且由于子实体鉴别器,赋值类型将是隐式的。读取现有实体实例并获取关联的赋值类型时,将加载相应的赋值类型。