Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 OpenJPA:多个@Embedded与一个@ElementCollection_Java_Jpa_Jpa 2.0_Openjpa - Fatal编程技术网

Java OpenJPA:多个@Embedded与一个@ElementCollection

Java OpenJPA:多个@Embedded与一个@ElementCollection,java,jpa,jpa-2.0,openjpa,Java,Jpa,Jpa 2.0,Openjpa,我正在尝试决定使用哪个注释。你能提出你的意见吗 我现在所拥有的: @Entity public class Balance { @Embedded private Amount amountAtm; @Embedded private Amount amountBranch; @Embedded private Amount amountVault; } @Embeddable public Amount { private BigD

我正在尝试决定使用哪个注释。你能提出你的意见吗

我现在所拥有的:

@Entity
public class Balance {
    @Embedded
    private Amount amountAtm;

    @Embedded
    private Amount amountBranch;

    @Embedded
    private Amount amountVault;
}

@Embeddable
public Amount {
    private BigDecimal debit;
    private BigDecimal credit;
}
我想将其更改为:

@Entity
public class Balance {
    @ElementCollection
    private Map<AmountType, Amount> amounts;
}

public enum AmountType {
    ATM, BRANCH, VAULT;
}
@实体
公共阶级平衡{
@元素集合
私人地图金额;
}
公共枚举数量类型{
ATM、分行、金库;
}
金额将保持不变

这一变化的原因是,余额中的金额在概念上是一个集合。我要么同时显示/更改它们,要么根本不显示/更改。所以,我把他们当作一个群体

问题:

  • 现在,金额存储在与余额相同的表中(我覆盖列名,代码中没有显示)。但是,如果我做了此更改,就无法将所有这些数据存储在一个表中。我必须将金额存储在单独的表中这是否正确?

  • 考虑到现在我将不得不在SQL等中进行联接。这将如何影响性能?假设我使用的是Oracle 11g,我有100000个余额记录(因此有300000个金额)。我会注意到更改后应用程序的速度减慢吗

  • 是的,没错
  • 没有测试就说不出来。我不认为它比直接在表中存储这六个字段更快
  • 我不明白的是你为什么对你的三个领域不满意。如果您希望能够在实体中拥有
    Map getAmounts()
    方法(以及相应的setter),那么没有什么可以阻止您添加它并自己实现它:

    public Map<AmountType, Amount> getAmounts() {
        Map<AmountType, Amount> result = new HashMap<AmountType, Amount>(3);
        result.put(AmountType.ATM, amountAtm);
        result.put(AmountType.BRANCH, amountBranch);
        result.put(AmountType.VAULT, amountVault);
        return result;
    }
    
    publicmap getAmounts(){
    映射结果=新的HashMap(3);
    结果.put(AmountType.ATM,amountTM);
    结果.put(AmountType.BRANCH,amountBranch);
    结果.put(AmountType.VAULT,amountVault);
    返回结果;
    }
    
    JPA(1或2或2.1)没有此类@EmbeddedCollection注释,也不在OpenJPA文档中。也许澄清一下你的意思…@DataNucleus你是对的,我指的是\@ElementCollection注释。此外,我已将问题完全改写,使之更清楚。谢谢你的反馈。谢谢你的回复,JB。我希望能够在这些对象之间循环。。。是的,我可以实现您描述的方法,但我认为使用@ElementCollection将是一个更干净的解决方案,而且是“正确的方法”。我的意思是,如果这些对象在概念上是一个集合,这难道不足以将它们映射为一个集合吗?是的,你可能是对的。但是,他们可能也应该在自己的桌子上。