Java 在Hibernate中将一个DB关联拆分为多个集合
我试图模拟这种情况——有一种现金转账(我指的是带钱的汽车),它需要每种货币的金额,也需要每种货币的实际金额。在我看来,创建两个独立的类是毫无意义的,一个用于所需金额,另一个用于实际金额。因此,实施将如下所示:Java 在Hibernate中将一个DB关联拆分为多个集合,java,hibernate,collections,mapping,Java,Hibernate,Collections,Mapping,我试图模拟这种情况——有一种现金转账(我指的是带钱的汽车),它需要每种货币的金额,也需要每种货币的实际金额。在我看来,创建两个独立的类是毫无意义的,一个用于所需金额,另一个用于实际金额。因此,实施将如下所示: @Entity public class CashTransferCurrencyAmount { // id, version and so on @Column(length = 3) private String currencyCode; @Ba
@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>();
}
并将@WHERE
注释添加到现金转账
中的集合中。这对我来说更合适
2-创建两个联接表。一个用于映射请求金额,另一个用于映射实际金额。我不喜欢这个,因为我不希望数据库中有太多的表
有没有其他方法来实现这一点?我认为这种方法正确吗?请不要告诉我将申请金额和实际金额放在一个实体中。实际情况更为复杂,每个
cashtranfercurrencyAmount
都有自己的集合,因此无法通过这种方式解决
编辑至于完整故事的请求-过去在
cashtranfercurrencyAmount
中有两个值-required(我认为应该是'required')和actual,但现在每个金额都有自己的集合-如何将该金额拆分为面额。所以我需要一个金额集合,每个都有一个面值集合。对于请求的和实际的,CurrencyAmount和currencyDemination的类型似乎是相同的 因为您希望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();
}
您是说实际和要求的货币金额在您的实际模型中是不同的类型吗?如果是这样的话,他们不需要有单独的桌子吗?你没有给我们完整的故事,所以我觉得很难给你一个好的模型。我不够精确。我应该写“Hibernate如何知道每个CashTransferCurrencyAmount放在哪个集合中”。实例是相同的。但是在单个表中使用子类的想法很有趣。至少Hibernate会自己做这个区分工作。我最终决定使用一个区分器和where子句,但我喜欢你的答案,它是唯一的一个,所以我接受它。
@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();
}