Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hibernate中将一个DB关联拆分为多个集合_Java_Hibernate_Collections_Mapping - Fatal编程技术网

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();
}