Java Hibernate——一个设计问题
我正在从Java Hibernate——一个设计问题,java,hibernate,Java,Hibernate,我正在从JBoss网站上的教程学习Hibernate。我在一个代码示例中遇到了一个困惑 在4.1中有一个Cat类代码。一个简单的POJO示例 这个猫类将他的母亲称为私人猫妈妈 问题1。如果类的标识符属性为id,那么存储cat的母亲id而不是cat的母亲对象不是更好吗 指代 private Cat mother; 有这样的机会不是更好吗 private long motherId; `这就是hibernate隐式为您做的事情 ORM的好处在于,它完全隐藏了实现警告,因为您使用的是RDBMS,
JBoss
网站上的教程学习Hibernate。我在一个代码示例中遇到了一个困惑
在4.1中有一个Cat
类代码。一个简单的POJO示例
这个猫
类将他的母亲称为私人猫妈妈代码>
问题1。如果类的标识符属性为id
,那么存储cat的母亲id而不是cat的母亲对象不是更好吗
指代
private Cat mother;
有这样的机会不是更好吗
private long motherId;
`这就是hibernate隐式为您做的事情
ORM
的好处在于,它完全隐藏了实现警告,因为您使用的是RDBMS,而不是普通对象。您可以将mother
用作Cat
,而不用担心它的关系是由id
内部表示的。这就是hibernate隐式为您做的
ORM
的好处在于,它完全隐藏了实现警告,因为您使用的是RDBMS,而不是普通对象。您可以将mother
用作Cat
,而不用担心它的关系是由id
内部表示的。不一定,将对象引用与id相对存储是有益的,因为它隐式地验证引用,其中id可以是任何数字、有效的Cat id或其他。这是您必须处理的额外一层验证和错误检查
唯一需要警惕的陷阱是序列化对象,并确保没有无限循环,Dto可以在这方面提供帮助。例如,假设您想将Cat序列化到Web服务,并且只想序列化单个Cat,而不是整个Cat层次结构(Cat、Cat的母亲、Cat的母亲等)。您可以创建一个数据传输对象,它是一个围绕Car类的薄包装,这个包装可以序列化Id,而不是引用的对象,以便消费用户可以在需要时获得母对象。Dto还有其他好处,例如在底层域对象可以更改以最适合代码库的同时保持恒定的接口。不一定,存储对象引用而不是Id是有益的,因为它隐式验证引用,其中Id可以是任何数字、有效的Cat Id或其他。这是您必须处理的额外一层验证和错误检查
唯一需要警惕的陷阱是序列化对象,并确保没有无限循环,Dto可以在这方面提供帮助。例如,假设您想将Cat序列化到Web服务,并且只想序列化单个Cat,而不是整个Cat层次结构(Cat、Cat的母亲、Cat的母亲等)。您可以创建一个数据传输对象,它是一个围绕Car类的薄包装,这个包装可以序列化Id,而不是引用的对象,以便消费用户可以在需要时获得母对象。Dto还有其他好处,比如保持一个恒定的接口,而底层域对象可以更改以最适合代码库。除上述原因外,简单易用性如何?
如果我想使用您的设计遍历一棵族谱,代码如下所示:
Cat firstCat=//以某种方式启动Cat
Object someBroker=//获取第三方代理(如实体管理器)
Cat parent=broker.getCatById(firstCat.getParentId());
使用实际的对象引用,但要更加优雅:
Cat firstCat = // get initial cat
while ((Cat ancestor = firstCat.getParent)!=null) {
//work with ancestor
}
Cat firstCat=//获取初始Cat
while((Cat祖先=firstCat.getParent)!=null){
//与祖先一起工作
}
除上述原因外,简单易用性如何?
如果我想使用您的设计遍历一棵族谱,代码如下所示:
Cat firstCat=//以某种方式启动Cat
Object someBroker=//获取第三方代理(如实体管理器)
Cat parent=broker.getCatById(firstCat.getParentId());
使用实际的对象引用,但要更加优雅:
Cat firstCat = // get initial cat
while ((Cat ancestor = firstCat.getParent)!=null) {
//work with ancestor
}
Cat firstCat=//获取初始Cat
while((Cat祖先=firstCat.getParent)!=null){
//与祖先一起工作
}