我会尝试清楚地解释我的问题: 我有两个表:文档和类别,它们有多对多的关系。我正在学习用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是什么,我正在调查。
答案 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*
方法)完全适用于普通对象。