对象关系映射中的多值属性(Android应用程序)

时间:2012-01-24 16:14:15

标签: java android orm relational-database

在我正在构建的Android应用程序中,我将关系查询封装在模型层中。

我的一个对象,我们称之为Place,有一个多值属性(让我们称之为Image)。简化我可以说Java中的模型看起来像:

class Place{
    List<Image> images;
    ...
}


class Image {
    String description;
    String imageName;
    ...
}

在数据库中,这些类映射到表PLACE和IMAGE。

在Java方面,我使用DAO来查询,插入,更新和删除Place个对象。

作为一个简化示例,我希望有一个名为PlaceDataSource的类看起来像:

class PlaceDataSource {
    public List<Place> findAll();
    public void update(Place place);
    public void add(Place place);
    public void delete(Place place);
    ...
}

这些方法的描述如下:

findAll方法会回复Place个列表,每个列表都包含Image个对象的集合。

update方法更新Place及其图片(如有必要,更新,插入新图片或删除现有图片)。

add方法会在图片中添加新的Place

delete方法会删除Place及其所有图片。

findAlladddelete方法非常容易实现。 但是,我没有看到实现update方法的直接方法,该方法考虑了多值属性。我想到的程序算法是:

  • 从数据库中查询Place对象要更新的当前持久图像。
  • 找出Image对象的images属性中不再存在的Place个对象并删除它们。
  • 更新images属性中存在的持久图像。
  • 添加images属性中的新图片。

我认为这段代码会变得丑陋而且效率低下。 有没有更好的方法来实现DAO? 在使用DAO的应用程序中,您是否希望将每个DAO始终映射到一个物理表?

我考虑过在这种情况下使用两个不同的DAO,一个用于持久化Place个对象,另一个用于Image个对象。那么Place DAO不会对图像对象的持久性负责,而是“业务”层应该保持它们的一致性。 但是,Image在概念上是Place个对象的一部分,因此这个解决方案并不能完全说服我。

非常感谢您的反馈!

注意:目前我对使用Android的ORM框架不感兴趣,只是想从概念的角度找到这个问题的答案。

1 个答案:

答案 0 :(得分:1)

我是ORMLite的作者,它为你做了所有这些,但有几种方法你可以自己做。

您可以编写自己的List类(Collection更容易)来实现您想要的方法:addremove等。这些都是更改列表并通过DAO方法调用。对于示例代码,您可以查看ORMLite如何执行此操作BaseForeignCollectionEagerForeignCollection,但这可能会因您的需求而过度。

您提到的更容易手动维护列表。也许在PlaceDataSource上添加方法(看起来像DAO而不是DataSource)可以从列表中删除数据库。类似的东西:

class PlaceDataSource {
    /** deletes image at location index from list and removes from database */
    public void deleteImage(Place place, int index);
    /** add image to the list and to the database */
    public void addImage(Place place, Image image);
    ...

您必须确保不直接使用该列表,否则它将与数据库不同步。

您也可以在Place本身上使用这些方法,然后为每个Place对象注入其DAO。有些人喜欢这种模式,但我一直认为在另一个类中使用DAO方法更清晰。

希望这有帮助。