Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate——一个设计问题_Java_Hibernate - Fatal编程技术网

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){ //与祖先一起工作 }