Hibernate:设置新数据库对象对另一个对象的一对多引用,而不首先获取现有对象



我正在使用Hibernate构建一个应用程序。我使用的是一个数据库模式,其中包含两个名为assignmentassignment_type的表。后者包含描述assignment类型的主键/值对(例如"书面"、"实用")。

然而,assignment是由written_assignmentpractical_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,将insertableupdatable设置为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 {
    ...
}

当您需要创建一个新的子实体时,请使用构造函数,并且由于子实体鉴别器,赋值类型将是隐式的。读取现有实体实例并获取关联的赋值类型时,将加载相应的赋值类型。

最新更新