2016-07-29 30 views
1

我正在使用Hibernate构建应用程序。我使用的数据库模式包含(其中包括)两个表,分别为assignmentassignment_type。后者包含描述assignment类型(例如“书面”,“实用”)的主键/值对。Hibernate:将一个新的数据库对象的一对多引用设置为另一个对象,而不先获取现有对象

assignment然而,是一个抽象类,扩展的类如written_assignmentpractical_assignment。为此,我使用类表继承方法(some details on the topic)。现在

,它将使意义就像written_assignment创建类的实例中,这样的过程中设置在assignment_type合适的对象的引用:

public WrittenAssignment() { 
    AssignmentType assignmentType = ...; // Create or acquire appropriate instance 
    this.setAssignmentType(assignmentType); 
} 

据我了解,去与“创建实例”方法将只能工作一次,即一次是数据库中没有对象的状态,但具有该值(因为assignment_type表的值设置为唯一的)。

有没有办法在WrittenAssignment的构造函数中设置从assignment_type开始的对象的引用而不先获取它?奖金问题:如果没有匹配的对象存在,它可以被创建吗?

回答

1

您可以使用从assignment表作为辨别列引用assignment_type表中的列,然后映射AssignmentType关系为只读@ManyToOne,设置insertableupdatablefalse

@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 { 
    ... 
} 

当你需要创建一个新的子实体,使用构造和分配类型会隐由于子实体鉴别器。读取现有实体实例并获取关联的分配类型时,将加载相应的分配类型。

+0

谢谢,这个作品像一个魅力! 在处理超类查询时,鉴别器可以用来自动获取适当的子类吗? – koala

+1

尝试执行'Assignment'实体的查询,返回的结果实例的真实类必须是具体类型(不是父抽象类型)。 – JMSilla

+0

再次感谢!这将是我期望的行为,并且它有部分功能。我调整了'toString'方法,以便识别真正的类,这是可行的。但是,我无法使用'instanceof'检查子类,也不能对它进行类型转换。 'getClass()。getName()'返回抽象类的名称,后跟一串下划线,美元符号和其他字符。我想这可能是一些我不明白的反思。 – koala

相关问题