具有一对多关系的hibernate辅助表

时间:2014-08-31 14:37:19

标签: hibernate

我们的目标之一是遵循面向对象的设计并提出业务对象,然后麻烦地为持久性创建适当的映射。它似乎在很大程度上起作用,但我陷入了以下情况:

规则表

RuleId(PK), 名称, 说明, 型

RuleDetail表

RuleDetailId(PK), RuleId(FK), 类型, 开始日期, 结束日期 ......其他10个栏目

这里重要的是这些对象遵循继承关系(由Type管理)以及Rule和RuleDetail之间的一对多。

@Entity
@Table(name="RULE")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name = "TYPE",
    discriminatorType=DiscriminatorType.INTEGER
)
@SecondaryTable(name="RULE_DETAIL", pkJoinColumns={
    @PrimaryKeyJoinColumn(name="id", referencedColumnName="RULEID")})
public abstract class RuleBO extends BaseBO<Long> implements IRuleBO {
    @Id @Column(name = "RULEID")    
    private Long id;
    @Column(name="name")
    private String name;
    @Column(name = "desc")
    private String desc;
    @Enumerated(EnumType.ORDINAL)
    @Column(name= "TYPE")
    private RuleType type;

    @Embedded
    @Column(table="RULE_DETAIL")
    private Effectivity effectivity;

    @Column(name="AMOUNT", table="RULE_DETAIL")
    private Double Amt; 
    @Column(name="PERCENTAGE", table="RULE_DETAIL")
    private Double percentage;

    @Column(name="PERCENTAGEOF", table="RULE_DETAIL")
    private Integer percentageOf;

    ......specify all the remaining columns
}

我正在努力想出在哪里指定OneToMany关系。我应该为所有辅助表列还是仅指定外键列?我甚至不确定这种方法是否有效。 当我创建多个BO并使用连接标准时,它按预期工作,但我接受了挑战,使它只使用一个BO,并努力使其工作。有人可以指导我朝正确的方向发展吗?在基本级别,次要表似乎是直截了当,但我不知道我是否过度复杂的解决方案。我不确定我是否也可以在辅助表上指定ID。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我不会在Hibernate中加入这些表,就像你强制1:1一样,因为父类RuleBO只有一个实例“Amount”,“Percentage”和“percentageOf”在子表中(你想成为1:n)。

相反,创建一个RuleDetail类并使用@OneToMany批注将其映射回RuleBO类。

此外,不要缩写变量并在使用camelCase时保持一致(即使用“金额”而不是“Amt”)

private List<RuleDetailBO> ruleDetails;

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="ruleid")
public List<RuleDetailBO> getRuleDetails() {
    return ruleDetails;
}