考虑以下JPQL查询:
SELECT foo FROM Foo foo
INNER JOIN FETCH foo.bar bar
WHERE bar.baz = :baz
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其转换为Critieria查询.这是我得到的:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
Root<Foo> r = cq.from(Foo.class);
Fetch<Foo, Bar> fetch = r.fetch(Foo_.bar, JoinType.INNER);
Join<Foo, Bar> join = r.join(Foo_.bar, JoinType.INNER);
cq.where(cb.equal(join.get(Bar_.baz), value);
Run Code Online (Sandbox Code Playgroud)
这里显而易见的问题是我正在进行两次相同的连接,因为Fetch<Foo, Bar>
似乎没有方法来获取Path
.有没有办法避免必须加入两次?或者我是否必须坚持使用简单的查询这么好的旧JPQL?
好的,每个人都知道不鼓励使用(N)Hibernate的每个应用程序的全局会话.但是我有一个非常具体的,显然是非标准的用例,它似乎是理想的解决方案.
总而言之,我的(服务器)应用程序基本上将所有持久数据保持在内存中,并且从不查询数据库以进行正常操作.首先是数据库的唯一原因是数据在过程的生命周期中存活.我只想在应用程序启动时查询数据库以将所有内容提取到内存中.数据库实际上只有5-10 MB左右.
现在的问题是,如果我遵循会话必须短暂的建议,我必须为每个业务事务合并()我的所有数据或以某种方式手动跟踪所有更改,而不是利用NHibernate的自动更改跟踪.这使得持久性很难实现而不会导致很多性能开销.
所以我的问题是,为什么我不应该为这个特定的用例使用全局会话?
我所知道的反对全球会议的常见论点:
随着时间的推移,第一级缓存将被整个数据库填充=>我不介意,因为我实际上想要将所有数据都存储在内存中!
陈旧的数据和并发问题=>我的应用程序的设计使得所有可以访问或修改持久数据的代码必须是单线程的(有意的设计选择),并且它是唯一可以写入数据库的应用程序.所以这应该不是问题.
如果会引发异常(例如数据库超时)会话会被破坏=>这是我能看到的唯一真正的问题,但可以通过丢弃会话,创建新会话并刷新所有数据来解决.价格昂贵,但例外情况应该非常罕见,只能由主要错误或主要基础设施问题引起,这些问题都应该尽快解决.
所以我认为没有理由不为我的特定用例使用全局会话.或者有什么重要的东西我不见了?
更新1:这是一个服务器应用程序
更新2:这并不意味着长期存在的全球交易.交易仍然是短暂的 - 一个长期会话,许多短期交易.
想象一下,我有一个使用 Kotlin 实现的 Spring WebFlux 控制器,如下所示:
\n@RestController\n@RequestMapping("/api/foo")\nclass MyController {\n @GetMapping\n suspend fun getFoo(): FooResource {\n return withContext(Dispatchers.IO) {\n // fetch some resource with some expensive blocking IO call\n }\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n根据我理解 WebFlux 并发模型的方式,只有一个线程可用于处理请求,因此如果由于某种原因我无法避免阻塞 IO 调用,我需要以某种方式将其卸载到另一个线程。据推测,助手kotlinx.coroutines.withContext
正是这样做的,调度程序IO
是专门为这种用例而设计的。“我在几篇博客文章中看到过这种模式,所以这似乎是常识。
然而,[文档Dispatchers.IO
说:
\n\n此调度程序与默认调度程序共享线程,因此使用 withContext(Dispatchers.IO) { ... } 不会导致实际切换到另一个线程 \xe2\x80\x94 通常执行会在同一线程中继续。由于线程共享,在通过 IO 调度程序进行操作期间可以创建(但不使用)超过 64 个(默认并行)线程。
\n
所以这让我想知道:如果 WebFlux 只使用单个“主线程”来处理请求,并且即使我正在使用,阻塞 IO 仍可能在该线程中发生withContext(Dispatchers.IO)
:此模式是否可以安全使用,如果不是,还有什么我应该做什么?
我对PostgreSQL很陌生,对MS SQL Server有相当多的经验.引起我注意的PostgreSQL的一个特性是SSPI身份验证,我希望这样可以更轻松地从MS SQL过渡.但是,我似乎无法让它发挥作用.
目前,服务器和客户端都在同一台Windows 7上运行,该机器不是域的成员.如果我理解正确,SSPI auth从Kerberos回退到NTLM,所以它应该在没有域的情况下工作 - 我是对的吗?
当我尝试连接(从.NET应用程序通过Npgsql)时,我得到一条NpgsqlException
消息:Fatal: 28P01: password authentication failed for user "xxx"
消息对我来说有点令人费解,因为我没有使用密码验证.
我的pg_hba.conf
:
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
host all all 127.0.0.1/32 sspi
Run Code Online (Sandbox Code Playgroud)
Npgsql连接字符串:
Server=127.0.0.1;Port=5432;Database=mydb;Integrated Security=true;
我在这做错了什么?或者是没有域名它不起作用?
我在使用 m2eclipse 项目构建器在 Eclipse 3.6 中使用 Maven 构建 EJB EAR 时遇到问题。奇怪的是,手动构建(在命令行上或使用“Run as -> Maven build”)工作正常。我已将 Eclipse 设置为使用外部 Maven 2.2.1 安装。
错误信息如下:
Build errors for my-app; org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-ear-plugin:2.4.2:generate-application-xml (default-generate-application-xml) on project my-app: Failed to initialize ear modules
Run Code Online (Sandbox Code Playgroud)
因此,由于某些原因,我还无法确定 application.xml 描述符的生成显然失败了。
在错误日志视图中,我收到以下消息:
Unknown artifact type[test-jar]
Run Code Online (Sandbox Code Playgroud)
我在一个论坛中读到过,这可能是由缺少“test”范围的“test-jar”依赖引起的;但是,我对此进行了双重和三次检查,并且在我的 pom.xml 文件中找不到任何无作用域的“test-jar”依赖项。
我在 mvn help:effective-pom 中找到了以下条目:
<dependency>
<groupId>org.jboss.test</groupId>
<artifactId>jboss-test</artifactId>
<version>1.1.4.GA</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>apache-log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- ... --->
<dependency>
<groupId>jboss.jms-integration-tests</groupId>
<artifactId>integration-mdb20</artifactId>
<version>1.0.1.GA</version>
</dependency>
<dependency>
<groupId>jboss.jms-integration-tests</groupId>
<artifactId>integration-mdb20-durable</artifactId>
<version>1.0.1.GA</version>
</dependency>
<dependency>
<groupId>jboss.jms-integration-tests</groupId> …
Run Code Online (Sandbox Code Playgroud) 我有一本教C++编程的书.在书中,它说"条件表达式可以出现在某些程序位置,如果...... else语句不能"本书没有指明在哪里.我很好奇是否有人可以向我展示一个例子,你明确必须使用条件语句而不是if ... else语句.
谢谢,
java ×4
c++ ×1
criteria ×1
ear ×1
eclipse ×1
hibernate ×1
jpa ×1
jpa-2.0 ×1
kotlin ×1
m2eclipse ×1
maven ×1
nhibernate ×1
npgsql ×1
orm ×1
postgresql ×1
spring-boot ×1
sql ×1
transactions ×1