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

问题描述:

我会尝试清楚地解释我的问题: 我有两个表格:文档和类别,它们有多对多的关系。我正在学习如何用Java编写优雅的程序,请原谅我的无知。如何在Java中创建两个元素之间的关系?

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

我创建了一个类文档和一个类的类别;我是否需要添加类别的ArrayList作为类文档的属性?和一个文档ArrayList的属性在类别?

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

我的class文件看起来像:

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中,所以我只是使用基本的Java (没有ORM,没有框架)。我不知道Hibernate是什么,我正在调查。

我需要添加 类别的ArrayList作为类文档的属性吗?和一个 文档的ArrayList作为属性的类别?

这取决于你想访问你的对象的方式。如果它足够满足您的使用情况通过文件

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

接入类,你不需要通过类别来访问文件这样

category1.getDocuments().get(0)... 

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


我也需要做一些文件的修改,我需要创建class文件的属性ID使ID从表存储在数据库,以便更新是更容易?

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


正如你说,你是学习Java的我想补充一些一般性意见:

你宣布这样的例子名单:

private ArrayList<String> category; 

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

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

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

另外我想提一下,有很多支持将数据库内容映射到Java对象的框架。所以如果你必须做很多映射,你应该考虑使用其中的一种(例如休眠)。

+0

非常感谢!所以我会满足于这个“手动”(?)映射。我会在晚些时候看看Hibernate! – zwan 2012-02-23 20:33:49

如果您使用的是像Hibernate这样的ORM,您可以使用ArrayList<Category>而不是一个字符串。这将是更纯粹的面向对象方法。不知道为什么你将其标记为MVC。

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

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