我试图模拟这种情况 - 有现金转移(我的意思是一辆带钱的车),每种货币需要的金额,以及每种货币的实际金额。在我看来,创建两个单独的类是毫无意义的,一个用于所需金额,另一个用于实际金额。所以实现看起来像这样:
@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的类型似乎相同。
答案 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();
}