我们的目标之一是遵循面向对象的设计并提出业务对象,然后麻烦地为持久性创建适当的映射。它似乎在很大程度上起作用,但我陷入了以下情况:
RuleId(PK), 名称, 说明, 型
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。非常感谢任何帮助。
答案 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;
}