Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Performance Hibernate:em.getReference().getList()。是否添加(记录)性能?_Performance_Hibernate_Jpa - Fatal编程技术网

Performance Hibernate:em.getReference().getList()。是否添加(记录)性能?

Performance Hibernate:em.getReference().getList()。是否添加(记录)性能?,performance,hibernate,jpa,Performance,Hibernate,Jpa,使用Hibernate(JPA)时,如果执行以下调用: MyParent parent = em.getReference("myId"); parent.getAListMappedAsOneToMany().add(record) record.setParent(parent); 是否存在任何性能问题 我的想法是,getReference不加载实体,getalistemappedasonetomy()。add不需要加载列表,因为它被定义为延迟获取 getalismappedasonet

使用Hibernate(JPA)时,如果执行以下调用:

MyParent parent = em.getReference("myId");
parent.getAListMappedAsOneToMany().add(record) 
record.setParent(parent);
是否存在任何性能问题

我的想法是,
getReference
不加载实体,
getalistemappedasonetomy()。add
不需要加载列表,因为它被定义为延迟获取

getalismappedasonetomy
如果确实访问了一个非常大的列表(通过调用
get
size
方法),它可能会返回一个非常大的列表

您能确认这样的代码没有性能问题吗?

getReference()
不会转到数据库,并返回代理。但是,如果在代理上调用一个方法,它将初始化代理并从数据库中获取实体数据。因此,由于您在实体上调用了
getAListMappedAsOneToMany()
,因此,通过调用
getReference()
而不是
find()
,您不会获得任何收益

类似地,列表也是延迟加载的。这意味着只有在您对其调用方法时才会加载它。您确实在它上面调用了一个方法:
add()
。因此,列表中元素的数据也从数据库中加载

在devlopment中打开SQL日志记录,以查看和理解Hibernate执行的所有查询

如果要避免加载列表,请将代码替换为

MyParent parent = em.getReference("myId");
record.setParent(parent);
这不会从数据库中加载任何内容,并且会使关联持久化,因为Record.parent是关联的所有者端。但请注意,如果父对象之前已加载,这也会使内存中的对象图不一致。

getReference()
不会转到数据库,并返回代理。但是,如果在代理上调用一个方法,它将初始化代理并从数据库中获取实体数据。因此,由于您在实体上调用了
getAListMappedAsOneToMany()
,因此,通过调用
getReference()
而不是
find()
,您不会获得任何收益

类似地,列表也是延迟加载的。这意味着只有在您对其调用方法时才会加载它。您确实在它上面调用了一个方法:
add()
。因此,列表中元素的数据也从数据库中加载

在devlopment中打开SQL日志记录,以查看和理解Hibernate执行的所有查询

如果要避免加载列表,请将代码替换为

MyParent parent = em.getReference("myId");
record.setParent(parent);
这不会从数据库中加载任何内容,并且会使关联持久化,因为Record.parent是关联的所有者端。但是要注意,如果父对象之前已经加载过,这也会使内存中的对象图不一致。

getReference()
在您不想使用对象的任何成员,而是想将对象的引用提供给另一个对象时非常有用。例如,当实体A引用实体B并希望将B设置为A的B时,您需要的是
getReference()

但在您的情况下,当您获得代理对象时,您会立即尝试访问它的一个成员。(
alismappedasonetomy
)因此,整个
父对象将从数据库中加载

确实,当您
getAListMappedAsOneToMany().add(record)
时,仅当您设置
reverse=“true”

您可以从以下方面了解有关性能的更多信息:

getReference()
在您不想使用对象的任何成员而是想将对象的引用提供给另一个对象时非常有用。例如,当实体A引用实体B并希望将B设置为A的B时,您需要的是
getReference()

但在您的情况下,当您获得代理对象时,您会立即尝试访问它的一个成员。(
alismappedasonetomy
)因此,整个
父对象将从数据库中加载

确实,当您
getAListMappedAsOneToMany().add(record)
时,仅当您设置
reverse=“true”

您可以从以下方面了解有关性能的更多信息:

事实上,我已经激活了sql日志记录,在执行getReference().GetList().add()时没有看到sql查询(但我看到了其他sql查询,因此日志运行良好)。所以,我不明白…你确定你以前没有在同一个会话中加载对象吗?嗯,你是对的,这是在我日志的开头。所以这样做会对性能产生影响。。。(注:我刚刚看了你的博客,我现在对N3、N4太难了,干得好!)事实是我已经激活了sql日志记录,在执行getReference().GetList().add()时没有看到sql查询(但我看到其他sql查询,所以日志运行良好)。所以,我不明白…你确定你以前没有在同一个会话中加载对象吗?嗯,你是对的,这是在我日志的开头。所以这样做会对性能产生影响。。。(注:我刚刚看了你的博客,我现在对我来说N3、N4太难了,干得好!)