如何在Java中创建两个元素之间的关系?
我会尽量清楚地解释我的问题: 我有两个表:document和category,它们有多对多的关系。我正在学习用Java优雅地编程,请原谅我的无知 我正在对数据库进行搜索,我想在从resultSet创建对象时说明检索到的元素(文档)及其类别之间的相同关系 我已经创建了一个类文档和一个类类别;是否需要添加类别的ArrayList作为类文档的属性?和文档的ArrayList作为类别中的属性 我还需要对一些文档进行修改,我是否需要在类文档中创建一个属性id,以便将表中的id存储在DB中,以便更新更容易 我的类文档可能如下所示:如何在Java中创建两个元素之间的关系?,java,oop,orm,Java,Oop,Orm,我会尽量清楚地解释我的问题: 我有两个表:document和category,它们有多对多的关系。我正在学习用Java优雅地编程,请原谅我的无知 我正在对数据库进行搜索,我想在从resultSet创建对象时说明检索到的元素(文档)及其类别之间的相同关系 我已经创建了一个类文档和一个类类别;是否需要添加类别的ArrayList作为类文档的属性?和文档的ArrayList作为类别中的属性 我还需要对一些文档进行修改,我是否需要在类文档中创建一个属性id,以便将表中的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...
}
公共类文档{
私有整数id;//来自DB的id,如果是新对象,则为0
私有字符串名称;
私有字符串url;
创建私人日期;
私有数组列表类别;
//接球手和接球手。。。
}
这可能会让人困惑,但我只想以一种“标准”的方式来描述事情!我知道如何通过使用多个查询等以“肮脏”的方式完成所有这些。。。但我再次需要有经验的OO开发人员的想法
编辑:
我删除了MVC;
我在Java中是新的,所以我只使用基本的Java(没有ORM,没有框架)。我不知道Hibernate是什么,我正在调查。如果您使用类似Hibernate的ORM,您将使用
数组列表,而不是字符串列表。这将是更纯粹的OOP方法。不确定为什么将其标记为MVC。如果您使用的是类似Hibernate的ORM,您将使用ArrayList而不是字符串。这将是更纯粹的OOP方法。不确定为什么要将此标记为MVC
我需要补充吗
类别的ArrayList作为类文档的属性?和
是否将文档的ArrayList作为类别中的属性
这取决于访问对象的方式。如果您的用例通过文档访问类别就足够了
document1.getCategories().get(0)...
您不需要通过这样的类别访问文档
category1.getDocuments().get(0)...
,则只有一个列表就足够了。在本例中,您将这些类之间的关系称为单向关系。如果两种方法都需要,则需要两个列表。在这种情况下,你的关系是双向的。无论如何,如果单向关系已经足够了,那么您应该选择单向关系,因为在这种情况下,您不必使两个列表保持同步
我还需要对一些文档进行修改,我是否需要在类文档中创建一个属性id,以便将表中的id存储在DB中,以便更新更容易
这是一个设计问题。在大多数情况下,包含代理数据库键是有意义的,因为这样可以更容易地执行更新。无论如何,如果可以通过其他属性(例如名称)或这些属性的组合来标识对象,则当然不需要包含代理项键
正如您所说,您正在学习Java,我想补充一些一般性意见:
您在示例中声明了如下列表:
private ArrayList<String> category;
私有数组列表类别;
在这里,您应该更喜欢接口列表,而不是具体的实现类ArrayList
private List<String> category = new ArrayList<String>();
private List category=new ArrayList();
这将允许您使用任何类型的实现(例如ArrayList或LinkedList),因为您的代码不再依赖于具体的实现类
此外,我想提到的是,有许多框架支持将数据库内容映射到Java对象。所以,如果你必须做很多映射,你一定要考虑使用其中一个(例如Hibernate)。
我需要补充吗
类别的ArrayList作为类文档的属性?和
是否将文档的ArrayList作为类别中的属性
这取决于访问对象的方式。如果您的用例通过文档访问类别就足够了
document1.getCategories().get(0)...
您不需要通过这样的类别访问文档
category1.getDocuments().get(0)...
,则只有一个列表就足够了。在本例中,您将这些类之间的关系称为单向关系。如果两种方法都需要,则需要两个列表。在这种情况下,你的关系是双向的。无论如何,如果单向关系已经足够了,那么您应该选择单向关系,因为在这种情况下,您不必使两个列表保持同步
我还需要对一些文档进行修改,我是否需要在类文档中创建一个属性id,以便将表中的id存储在DB中,以便更新更容易
这是一个设计问题。在大多数情况下,包含代理数据库键是有意义的,因为这样可以更容易地执行更新。无论如何,如果可以通过其他属性(例如名称)或这些属性的组合来标识对象,则当然不需要包含代理项键
正如您所说,您正在学习Java,我想补充一些一般性意见:
您在示例中声明了如下列表:
private ArrayList<String> category;
私有数组列表类别;
在这里,您应该更喜欢接口列表,而不是具体的实现类ArrayList
private List<String> category = new ArrayList<String>();
private List category=new ArrayList();
这将允许您使用任何类型的实现(例如ArrayList或LinkedList),因为您的代码不再依赖于具体的实现类
此外,我想提到的是,有许多框架支持将数据库内容映射到Java对象。所以如果你必须做很多映射,你一定要考虑使用其中的一个(例如Hibernate)。 < P>托马斯的回答非常好。我只想补充一点,如果你想要双向的话