我在映射中有一个关联到一个急切加载的集合(lazy ="false"fetch ="subselect").在进行查询时,如何使用Hibernate以编程方式关闭它?
延迟执行几乎总是一个福音.但是有些情况下,这是一个问题,你诉诸"获取"(在Nhibernate)急切地获取它.
你知道懒惰的评价可以咬你的实际情况吗?
我遇到了我的代码中的一个错误,这让我觉得我并不真正理解有关F#和懒惰评估的一些细节.我知道F#急切地评估,因此我对以下函数感到有些困惑:
// Open a file, then read from it. Close the file. return the data.
let getStringFromFile =
File.OpenRead("c:\\eo\\raw.txt")
|> fun s -> let r = new StreamReader(s)
let data = r.ReadToEnd
r.Close()
s.Close()
data
Run Code Online (Sandbox Code Playgroud)
当我在FSI中称呼它时:
> let d = getStringFromFile();;
System.ObjectDisposedException: Cannot read from a closed TextReader.
at System.IO.__Error.ReaderClosed()
at System.IO.StreamReader.ReadToEnd()
at <StartupCode$FSI_0134>.$FSI_0134.main@()
Stopped due to error
Run Code Online (Sandbox Code Playgroud)
这让我觉得这getStringFromFile是懒惰的评价 - 所以我完全糊涂了.我没有得到关于F#如何评估函数的信息.
显然,有可能实现Haskell,使其在不改变语言语义的情况下急切地进行评估.如果是这样,那么如何处理无限数据结构?
http://csg.csail.mit.edu/pubs/haskell.html
因此,花费大量时间来创建和销毁暂停的计算(thunk).通常,这些计算非常简单,因此很容易对它们进行评估.Faxen和其他人已经使用静态分析来揭示这种渴望的机会.相反,我们建议在任何地方使用热情,同时使用允许我们恢复的机制,如果我们的计划过于急切的话.
关键是"如果我们的计划过于热切,我们就有机制可以恢复".这些机制是什么?他们如何允许无限的数据结构和懒惰评估的其他方面,我已经被认为是一种急切的语言是不可能的?
我正在尝试使用Hibernate从表中检索大约1亿行.我有一个持久化的实体项目,其中包含一个费用集合(另一个持久化实体).鉴于我将迭代结果并访问每个对象的费用,我想急切地获取费用以避免n + 1问题.
我还要提一下,我想将它加入另一个名为Provider的表(一对一映射但没有外键).我试过了:
String query = "select new " + Order.class.getName()
+ "(i, p) from Item i left join fetch i.fees f, Provider p where "
+ "p.factoryId=i.factoryId and p.factoryRef=i.factoryRef";
return session.createQuery(query).scroll();
Run Code Online (Sandbox Code Playgroud)
我的Order类包含Provider字段和Item字段.我收到此错误:
引起:org.hibernate.QueryException:查询指定的连接提取,但选择列表中不存在获取的关联的所有者
我想最终得到一个可滚动的Order列表,其中包含Item(收取费用)和Provider.
在我的Grails项目中,我有以下类:
class A {
static hasMany = [cs:C]
}
class B {
static hasMany = [cs:C]
}
class C {
static belongsTo = [a:A, b:B]
}
Run Code Online (Sandbox Code Playgroud)
我想查询A类并急切地带来B和C的所有关联.我尝试了以下条件查询,但是当我从A迭代Cs时,hibernate使用延迟初始化来查询B对象.
A.withCriteria() {
fetchmode "cs", FetchMode.JOIN
fetchMode "cs.b", FetchMode.JOIN
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
对不起这么久,但至少我认为我得到的所有信息都能够理解并可能有所帮助?
我想使用急切加载从我的数据库加载数据.
数据设置在五个表中,设置两个m:n关系级别.因此,有三个表包含数据(以层次结构的方式从上到下排序):
CREATE TABLE [dbo].[relations](
[relation_id] [bigint] NOT NULL
)
CREATE TABLE [dbo].[ways](
[way_id] [bigint] NOT NULL
)
CREATE TABLE [dbo].[nodes](
[node_id] [bigint] NOT NULL,
[latitude] [int] NOT NULL,
[longitude] [int] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
前两个实际上只包含他们自己的ID(用于挂钩此处不相关的其他数据).
在这三个数据表之间是两个m:n表,带有排序提示:
CREATE TABLE [dbo].[relations_ways](
[relation_id] [bigint] NOT NULL,
[way_id] [bigint] NOT NULL,
[sequence_id] [smallint] NOT NULL
)
CREATE TABLE [dbo].[ways_nodes](
[way_id] [bigint] NOT NULL,
[node_id] [bigint] NOT NULL,
[sequence_id] [smallint] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这基本上是OpenStreetMap数据结构的一部分.我让实体框架从这个数据库中构建它的对象,它就像表一样设置类.m:n表确实作为类存在.(我理解在EF中你可以构建你的对象m:n关系而不需要明确的中间类 - 我应该尝试以这种方式改变对象模型吗?)
我想做什么:我的切入点正是一个关系项.
我认为最好首先加载中间m:n关系,然后在循环中迭代并急切加载最低的一个.我试着用以下方式做到这一点
IQueryable<relation> query = context.relations;
query …Run Code Online (Sandbox Code Playgroud) 我试图让一些JPA的东西工作.我有一个表有另一个表的外键.当我生成JPA实体时,我会对这些变量进行一对多的编辑...还需要做什么才能将所有表格放回到结果集中?如果我确实称呼它.这是我想要做的一个例子.
@OneToMany(mappedBy="resourceId")
private List<DistributionLink> distributionLinkCollection;
Run Code Online (Sandbox Code Playgroud)
@OneToMany注释很漂亮......
我想要恢复所有值我需要调用调用此表的命名查询吗?
qLaunchArr = (QuickLaunch[])emf.createNamedQuery("QuickLaunch.getQuickLaunch").getResultList().toArray();
Run Code Online (Sandbox Code Playgroud)
我是否会想到我还将获得包含所有结果集的DistributionLinks数组?现在我知道这与Eager Loading vs Lazy加载有关.究竟是什么,我不确定.我知道延迟加载只加载显式调用的@oneToMany属性(我认为)?我怎样才能收回我需要的所有收藏品.我是否需要遍历结果集并调用命名查询以使用命名查询获取所有结果集?
谢谢.
List是Haskell的默认数据类型,为什么我们仍然需要Data.Sequence?Data.Seq是否意味着可以随机访问的C样式数组?
如果是,我认为这意味着Data.Sequence存储有固定的内存缓冲区,因此,急切的评估类型.只是一个猜测,你会帮忙纠正吗?谢谢.
我使用启用了eager模式的TF 1.8。
我无法在mapfunc中打印示例。当我从mapfunc中运行tf.executing_eagerly()时,出现“ False”
import os
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)
tfe = tf.contrib.eager
tf.enable_eager_execution()
x = tf.random_uniform([16,10], -10, 0, tf.int64)
print(x)
DS = tf.data.Dataset.from_tensor_slices((x))
def mapfunc(ex, con):
import pdb; pdb.set_trace()
new_ex = ex + con
print(new_ex)
return new_ex
DS = DS.map(lambda x: mapfunc(x, [7]))
DS = DS.make_one_shot_iterator()
print(DS.next())
Run Code Online (Sandbox Code Playgroud)
print(new_ex)输出:
Tensor("add:0", shape=(10,), dtype=int64)
Run Code Online (Sandbox Code Playgroud)
在mapfunc外部,它可以正常工作。但是在其中,传递的示例没有值,也没有.numpy()属性。