在Hibernate中将一个DB关联拆分为多个集合

时间:2009-12-07 08:14:29

标签: java hibernate collections mapping

我试图模拟这种情况 - 有现金转移(我的意思是一辆带钱的车),每种货币需要的金额,以及每种货币的实际金额。在我看来,创建两个单独的类是毫无意义的,一个用于所需金额,另一个用于实际金额。所以实现看起来像这样:

@Entity
public class CashTransferCurrencyAmount {
    // id, version and so on

    @Column(length = 3)
    private String currencyCode;

    @Basic
    private BigDecimal amount;

    @ManyToOne
    private CashTransfer cashTransfer;
}

@Entity
public class CashTransfer {
    // id, version and so on

    @OneToMany(mappedBy="cashTransfer")
    private Set<CashTransferCurrencyAmount> requiredCurrencyAmountSet = new HashSet<CashTransferAmountCurrency>();

    @OneToMany(mappedBy="cashTransfer")
    private Set<CashTransferCurrencyAmount> actualCurrencyAmountSet = new HashSet<CashTransferAmountCurrency>();
}

但CashTransferCurrencyAmount实例如何知道它属于哪个集合?我有两个想法:

1 - 在CashTransferCurrencyAmount中添加一个鉴别器字段:

public enum RequestType {
    ACTUAL,
    REQUIRED
}

@Basic
@Enumerated(EnumType.STRING)
private RequestType requestType;

并向@WHERE中的集合添加CashTransfer注释。这对我来说更好。

2 - 创建两个连接表。一个用于映射请求的金额,一个用于映射实际金额。我不喜欢这个,因为我不想在我的数据库中有太多表。

还有其他方法可以达到这个目的吗?我的方法是否正确?
并且不要告诉我将请求的和实际的金额都放在一个实体中。真实案例更复杂,每个CashTransferCurrencyAmount都有自己的集合,因此无法以这种方式解决。

EDIT
至于完整故事的请求 - 曾经有CashTransferCurrencyAmount中的两个值 - 必需(我认为它应该是'请求')和实际的,但现在每个金额都有它自己的集合 - 这个金额如何分成面额。所以我需要一个金额的集合,每个金额都有一个面额集合。对于请求的和实际的类型,CurrencyAmount和CurencyDenomination的类型似乎相同。

1 个答案:

答案 0 :(得分:1)

由于您希望CashTransferCurrencyAmount实例知道它属于哪个集合,我假设您希望有一些基于此的逻辑。我建模你的情况的方法是使用继承。

你说“在我看来创建两个独立的课程毫无意义”,但我会试着说服你应该这样做。您可以使用“单表”继承类型,这样就不会在数据库中引入其他表,这是您要完成的。

我的镜头看起来像是:


@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "request_type", discriminatorType = DiscriminatorType.STRING)
public abstract class CashTransferCurrencyAmount {
    // id, version and so on

    @Column(length = 3)
    private String currencyCode;

    @Basic
    private BigDecimal amount;

    @ManyToOne
    private CashTransfer cashTransfer;
}

@Entity
@DiscriminatorValue("REQUIRED")
public class CashTransferCurrencyAmountRequired extends CashTransferCurrencyAmount {
    // required anount specific stuff here
}

@Entity
@DiscriminatorValue("ACTUAL")
public class CashTransferCurrencyAmountActual extends CashTransferCurrencyAmount {
    // actual anount specific stuff here
}

@Entity
public class CashTransfer {
    // id, version and so on

    @OneToMany(mappedBy="cashTransfer")
    private Set requiredCurrencyAmountSet = new HashSet();

//Stackoverflow deleting my generic sets! But it's exactly the same as in your code...

    @OneToMany(mappedBy="cashTransfer")
    private Set actualCurrencyAmountSet = new HashSet();
}