如何在Java中创建两个元素之间的关系?

时间:2012-02-23 18:44:12

标签: java oop orm

我会尝试清楚地解释我的问题: 我有两个表:文档和类别,它们有多对多的关系。我正在学习用Java优雅地编程,所以请原谅我的无知,如果是这样的话。

我正在对我的数据库进行搜索,并且当我从resultSet创建对象时,我想说明检索到的元素(文档)与其类别之间的相同关系。

我创建了一个类文档和一个类类别;我是否需要添加Category的ArrayList作为Class Document的属性?还有一个DocumentList of Document作为Category?

中的属性

我还需要对某些文档进行修改,是否需要在类文档中创建属性ID,以便将数据库中的表存储到DB中,以便更新更容易?

我的班级文件可能如下:

public class Document {
    private Integer id; // Id from DB, 0 if new object
    private String name;
    private String url;
    private Date dateCreated;
    private ArrayList<String> category;

    // getters & setters...
}

这可能令人困惑,但我只是想以“标准”方式处理事情!我知道如何通过使用多个查询等方式以“肮脏”的方式完成所有这些......但我再次需要经验丰富的OO开发人员的想法!

编辑: 我删除了MVC; 我在Java中 new 所以我只使用基本的Java (没有ORM,没有框架)。我不知道Hibernate是什么,我正在调查。

3 个答案:

答案 0 :(得分:3)

  

我需要添加吗?   Category的ArrayList作为Class Document的属性?和   Document的ArrayList作为Category?

中的属性

这取决于您访问对象的方式。如果您的用例足以通过文档访问类别

document1.getCategories().get(0)...

并且您无需通过类似

的类别访问文档
category1.getDocuments().get(0)...

,那么只需一个列表即可。在这种情况下,您将单向调用这些类之间的关系。如果需要两种方式,则需要两个列表。在这种情况下,您的关系是双向的。无论如何,如果一个单向关系就足够了,你应该更喜欢那个,因为在这种情况下你不必保持两个列表同步。


  

我还需要对某些文档进行修改,是否需要在类文档中创建属性ID,以便将数据库中的表存储到DB中,以便更新更容易?

这是某种设计问题。在大多数情况下,包含代理数据库密钥是有意义的,因为它可以更容易地执行更新。无论如何,如果您的对象可以通过其他属性(例如名称)或这些属性的组合来识别,那么当然不需要包含代理键。


正如你所说的那样,你正在学习Java,我想补充一些一般性评论:

您已在示例中声明了这样的列表:

private ArrayList<String> category;

您应该更喜欢接口List而不是具体的实现类ArrayList。

private List<String> category = new ArrayList<String>();

这将允许您使用任何类型的实现(例如ArrayList或LinkedList),因为您的代码不再依赖于具体的实现类。

此外,我想提一下,有许多框架可用于支持将数据库内容映射到Java对象。因此,如果你必须做很多映射,你一定要考虑使用其中一个(例如hibernate)。

答案 1 :(得分:0)

如果您使用的是像Hibernate这样的ORM,那么您可以使用ArrayList<Category>代替字符串。这将是更纯粹的OOP方法。不确定为什么你把它标记为MVC。

答案 2 :(得分:0)

托马斯的回答非常好。我只想补充一点,如果你想要双向关系,你需要小心确保双方的合作伙伴列表保持一致。

有一个good article about this by Vincent Partington。他是从为JPA编写对象的角度编写的,但他描述的模式(使用internal*方法)完全适用于普通对象。