我会尽力清楚地解释我的问题: 我有两个表:文档和类别,它们具有多对多关系。我正在学习用 Java 进行优雅的编程,所以请原谅我的无知。
我正在数据库中进行搜索,当我从结果集中创建对象时,我想说明检索到的元素(文档)及其类别之间的相同关系。
我已经创建了一个类(class)文档和一个类(class)类别;我是否需要添加类别的ArrayList作为类文档的属性?文档的 ArrayList 作为类别中的属性?
我还需要对一些文档进行修改,我是否需要在类文档中创建一个属性id,以便将表中的id存储在数据库中,以便更新更容易?
我的类文档可能如下所示:
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...
}
这可能会令人困惑,但我只想以“标准”方式进行操作!我知道如何通过使用多个查询等以“肮脏”的方式完成所有这些...但我再次需要经验丰富的面向对象开发人员的想法!
编辑: 我删除了MVC; 我是 Java 新手,所以我只使用基本的 Java (无 ORM,无框架)。我不知道 Hibernate 是什么,我正在研究。
最佳答案
Do I need to add an ArrayList of Category as an attribute of Class Document? And an ArrayList of Document as attribute in Category?
这取决于您想要访问对象的方式。如果您的用例通过文档访问类别就足够了
document1.getCategories().get(0)...
并且您不需要通过这样的类别访问文档
category1.getDocuments().get(0)...
,那么有一个列表就足够了。在这种情况下,您可以将这些类之间的关系称为单向的。如果两种方式都需要,则需要两个列表。在这种情况下,你们的关系是双向的。无论如何,如果单向关系就足够了,您应该更喜欢这种关系,因为在这种情况下您不必保持两个列表同步。
<小时/>I also need to do modifications on some Documents, do I need to create an attribute id in Class Document so store the id from the table in DB so that the update is easier?
这是某种设计问题。在大多数情况下,包含代理数据库键是有意义的,因为它将使执行更新变得更容易。无论如何,如果您的对象可以通过其他属性(例如名称)或这些属性的组合来标识,那么当然不需要包含代理键。
<小时/>正如您所说,您正在学习 Java,我想添加一些一般性评论:
您已在示例中声明了该列表,如下所示:
private ArrayList<String> category;
您应该更喜欢 List 接口(interface),而不是这里的具体实现类 ArrayList。
private List<String> category = new ArrayList<String>();
这将允许您使用任何类型的实现(例如 ArrayList 或 LinkedList),因为您的代码不再依赖于具体的实现类。
此外,我想提一下,有许多可用的框架支持将数据库内容映射到 Java 对象。因此,如果您必须进行大量映射,那么您绝对应该考虑使用其中之一(例如 hibernate)。
关于java - 如何在 Java 中创建两个元素之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9419192/