2

假设我们有一个实体“某物”,并且该物与某些“数据”具有一对多(数百万倍)的关系。

Something 1 -> * Data
Data 1 -> 1 Something

现在,如果我们想添加一些数据对象,我们应该这样做:

Something.getDataList().add(Data)

这实际上将从数据库中提取所有数据对象,这不是最佳的恕我直言。

但是,如果我从某事中删除关系,并将其保留在数据中,我将能够准确地添加和检索我要求使用 DAO 的那些对象:

Something
Data 1 -> 1 Something

现在数据访问界面将如下所示:

Something.addData(Data) // will use DataDAO to save object

或者

Something.addData(List<Data>) // will use same DataDAO batch insert

我需要一些指导,也许我缺乏JPA的一些知识,不需要这个?此外,我不确定实体是否以这种方式自然,因为数据是由它们的方法提供的,但实际上并未包含在实体中,(如果这是正确的,那么如果存在性能关键操作处理,我应该删除每个一对多关系与那个特定的实体,这也是不自然的)。

在我的特殊情况下,我有很多 REST 消费者会定期更新数据库。我正在使用 ObjectDB、JPA ......但这里的问题更抽象。

4

1 回答 1

2

我相信,something.getDataList()如果有数百万Data条与Something. 正如您所说,调用something.getDataList().add(data)将从数据库中获取整个数据集以执行单个插入。此外,任何人都可能想用它something.getDataList().size来获取记录数,从而导致相同的开销。

我的建议是您将 DataDAO 用于此类操作(即添加或计数),例如:

void addData(Something something, Data data){
    //Something similar can be used for batch insert
    data.setSomething(something);
    em.persist(data);
}

List<Data> findData(Something something, MyFilter filter){
    // use a NamedQuery with parameters populated by something and your filters
    return em.getResultList();
}

Long countData(Something something){
    // use a 'SELECT COUNT(*) FROM Data d WHERE d.something = :something' NamedQuery 
    return em.getSingleResult;
}
于 2014-03-12T08:00:08.987 回答