首先,对不起我的英语。
这是我第一次使用Java编写数据库,我想在纯JDBC和SQL中编写一个简单的中间层(在数据库和应用程序之间),它将我的表映射到对象上(反之亦然)。我已经阅读了一些关于DAO,ORM和Active Record模式的内容,有一件事困扰我:在填充由多个表组成的对象时,这个系统如何处理数据冗余?
例如:
我有两张桌子
TABLE message (id, content, recipient_id)
TABLE person (id, name, address)
我希望将其映射到
/* depends on message and person tables */
class Message
{
public Message(int id, String content, Person recipient) {...}
// setters, getters ommited.
private int id;
private String content;
private Person recipient;
}
/* depends on person table */
class Person
{
public Person(int id, String name, String address) {...}
// setters, getters ommited.
private int id;
private String name;
private String address;
}
我看到两个解决方案:
1)我可以通过在table message
上执行SQL select连接这两个表来将Message
映射到对象message.recipient_id = person.id
。相应的对象将填充new Message(..., new Person(...))
。只要人与信息之间存在“一对多”关系,这当然会给我留下大量重复数据。
2)我可以从table person
中选择所有内容,使用new Person(...)
填充对象并将其存储在Map<Integer, Person>
中(地图键将保存ID)。然后选择table message
中的所有内容,并通过查找匹配的Person
手动“加入”这两个。这将给我留下一个由多个Person
引用的Message
实例,但我很担心在这种情况下保留数据库中数据的全部意义。
ORM系统如何处理?在那种情况下我该怎么办?