问题标签 [jpa-2.1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2000 浏览

jakarta-ee - 在@MappedSuperclass 中定义@UniqueConstraint

我有一个要求,其中我的许多实体需要一个 Long 值以及与其他实体的 @ManyToOne 关系。使用 MappedSuperclass 可以通过以下方式轻松实现此要求:

问题是长值和实体组合必须是唯一的。是否可以在超类中定义索引?如果我在实体的@Table 中定义索引,则代码按预期工作

挫折是约束必须沿所有子类复制,然后所有更改也需要复制,使继承几乎无用(绝对不那么优雅)

总结这里真正的问题是:可以从@MappedSuperclass 定义复合唯一约束吗?如果答案是否定的,那你会怎么做?

PS:我知道这只有在表生成生效时才有意义,这都是我们编码和最佳实践政治的一部分。

0 投票
2 回答
692 浏览

java - 在没有容器的情况下将数据源设置为 JPA

我想在测试我的实体时使用 aa 一个特殊的数据源

https://code.google.com/p/datasource-proxy/

它包装了原始数据源(在我的例子中是 apache derby 的)ClientDataSource

那么如何在没有容器的情况下将数据源注入我的 JPA 中......?

我尝试使用 simple-jndi 但不起作用。(不使用 JPA2 的 eclipse 链接实现)

配置持久性单元时,有没有办法绕过数据源的 JNDI?

(以编程方式?)

谢谢。

0 投票
1 回答
2034 浏览

hibernate - 使用 EclipseLink 和 Hibernate (JPA2.1) 生成模式 - @ForeignKey 被忽略

我正在测试 JPA2.1 和新的“模式生成”功能。为此,我在 HyperSQL 数据库下测试了两个实现:

  • EclipseLink 2.5.2-M1 是参考实现。
  • 休眠 4.3

我对实现没有任何偏好(甚至对性能也没有)。我测试了 EclipseLink,因为它是第一个可用的 JPA2.1 实现,但是现在,Hibernate 4.3 就在这里并且符合 JPA2.1。我唯一想要的是获得独立于 JPA 提供者的东西——除了配置(如缓存、日志记录、静态编织......)。

至于模式生成,有几个方面让我很感兴趣:

  • 我对 EclipseLink 的默认命名策略不满意:将实体类名称或字段/属性名称大写,使其不可读。而且我不会扩展会话定制器(我尝试过一次,我认为放置注释更容易,更危险......)。
  • 我不喜欢查询中的大写;好吧,这是个人喜好,但我在 linux 上也遇到了 mySQL 的问题,因为它们不遵循标识符,并且关键字不区分大小写,除非你双引号它们SQL 成语。
  • 默认情况下,Hibernate 并没有好多少,但是可以使用ImprovedNamingStrategy. 可悲的是,它没有用显式名称命名外键:FK_8gc2pk9u5bsbhpi91x93c77o不是显式的,fk_foobar_sample而是。

因此,我添加了@Table,@JoinColumn@Column注释来强制我的命名策略,现在我被外键生成阻止了,它的支持似乎很差(当符合 JPA2.1 时):

  • Hibernate 希望我使用@org.hibernate.annotations.ForeignKey,为此我需要注释字段或属性。但它是一个休眠注释,因此它不符合 JPA2.1。
  • EclipseLink 从不生成外键约束,除非我放了 a@JoinColumn和 a foreignKeywith @ForeignKey(name="...")。但是,虽然它生成了一个外键,但缺少定义(即ALTER TABLE foobar ADD CONSTRAINT fk_foobar_zorg FOREIGN KEY () REFERENCES ():),而根据 Javadoc 它应该存在。
  • @ManyToOneHibernate 需要生成外键(抛出异常),而 EclipseLink 不需要。我不明白为什么需要它:如果引用的类型被注释了,@Entity那么我为什么要放@OneToOne, @ManyToOne@OneToMany以及@ManyToMany何时可以完美地从引用的类中推断出来。
  • EclipseLink 不会为@JoinColumn没有foreignKey集合注释的字段生成外键约束。

我应该怎么做才能以纯 JPA2.1 方式完成工作?

来源

因为我的示例案例太大而无法放在 Stackoverflow 上,所以您会找到一个包含 4 maven 3 project的存档:

  • jpa2.1-parent : 父项目 (POM)
  • jpa2.1-eclipselink :带有@Table@JoinColumn注释的 EclipseLink 2.5.2-M1。
  • jpa2.1-eclipselink-default : EclipseLink 2.5.2-M1 没有@Table@JoinColumn注释和默认命名策略
  • jpa2.1-hibernate :具有自定义名称的 Hibernate 4.3。
  • jpa2.1-hibernate-default : Hibernate 4.3 没有@Table@JoinColumn注释和默认命名策略

只需mvn test在根项目上运行,然后运行您喜欢的任何差异工具:

也可以使用 Eclipse 的 Maven 插件将 POM 导入 Eclipse(在 Kepler 上测试)。

生成的 SQL

作为参考,这里是不同 SQL 文件的结果(drop 文件也是错误的,只是因为约束名称没有重载)。

EclipseLink

如您所见,外键约束在语法上是无效的;并且有两个缺少的约束foobar(一个到zorg,另一个到grumph)。

EclipseLink(没有@Table,@JoinColumn)

毫不奇怪:如果 EclipseLink 不能生成至少正确的东西,它就不会被使用。

休眠

Hibernate 会忽略我的自定义外键名称,除非我使用他们的注释。

0 投票
1 回答
51160 浏览

java - 如何在 persistence.xml 中指定 JPA 2.1?

在网上快速搜索会发现三四个变体,人们如何指定xmlnsxsi:schemaLocationpersistence.xml.

指定 JPA 2.1 版的“正确”方式是什么?

我正在使用

0 投票
1 回答
167 浏览

java - 是否可以使用通过蓝图注入的 OSGi Enterprise 4.x & JPA 2.1 Entity Listener?

我们身处 OSGi 世界。

所以看起来可注入的 EntityListener 在 OSGi 中不起作用,即使 EclipseLink 支持它们。

目前是否可以在 blueprint.xml 中定义 EntityListener 并将它们用于注入?这将允许将 OSGi 服务注入实体侦听器。(目前我们需要使用 FrameworkUtil 进行显式查找来进行查找。)

有没有人这样做成功并且可以分享一些提示,特别是关于使用的捆绑包(版本)?

0 投票
1 回答
1065 浏览

hibernate - 是否可以使用 JPA @OrderBy 注释以不区分大小写的方式进行排序?

我正在使用 JPA 2.0、Hibernate 4.1.0.Final 和 MySQL 5.5。我想使用 @OrderBy 注释对我的一个实体中的集合进行排序……</p>

但是,我希望以不区分大小写的方式对集合进行排序,或者至少根据“名称”属性的小写字母对所有内容进行排序。JPA可以做到这一点吗?如果这解决了我的问题,我可以升级我的 JPA 和 Hibernate 版本。

0 投票
1 回答
1683 浏览

java - JPA 2.1 实体图的子图生成空连接

我在 JPA 2.1 中使用了一个名为Entity Graphs with QueryDSL的新功能。它工作得很好。但是当我使用subgraph时,JPA 会生成无效的 SQL。这是我的示例:

这是生成的SQL:

那条空荡荡的车道在里面做什么?这是一个错误吗?

0 投票
1 回答
4491 浏览

slf4j - Hibernate 4 Wildfly 8日志记录不起作用

如何让 hibernate 4 通过 logback 登录?我将一场战争部署到了wildfly 8 final,并且我正在使用带有logback的slf4j。日志记录设置在应用程序中 100% 工作,控制台附加程序和文件附加程序都按预期工作。

这是我为使 slf4j + logback 工作所做的工作:

在 WEB-INF 中使用 jboss-deployment-structure.xml 排除了日志子系统:

在 pom 中包含 slf4j 和 logback 依赖项:

使用 org.slf4j.Logger 登录应用程序

在 logback.xml 中添加了 3 个记录器:

我在日志中看不到任何与休眠相关的内容。

我唯一一次从休眠中看到任何东西是当我添加到我的 persistence.xml 时:

但即使我的根记录器设置为 trace ,它也会记录到服务器日志和控制台而不是我的 logback 附加程序。. .

logback ViewStatusMessagesServlet 看起来很健康,并显示已注册的休眠记录器:2014-02-23 19:02:37 INFO LoggerAction 将记录器 [org.hibernate.type] 的级别设置为 ALL

2014-02-23 19:02:37 INFO LoggerAction 将记录器 [org.hibernate] 的级别设置为 TRACE

我还可以使用在 persistence.xml 中注册的 hibernate.ejb.interceptor 记录准备好的语句。不幸的是,这也没有提供任何获取查询参数的方法

谁能帮我吗?

0 投票
2 回答
902 浏览

java - 数据库生成失败 JPA

我正在使用 Glassfish 4 和 JPA 2.1 和 Netbeans 7。

为了生成表,我有这些 bean:

我得到了这个服务器数据库日志消息:

0 投票
0 回答
1204 浏览

java - JPA 2.1 derby/javadb 创建带有换行符的脚本将不会运行

请查看我的创建脚本。

我的目标是通过脚本控制模式的创建,并让元数据内容处理删除。

创建脚本将被执行,但在第一行末尾失败。似乎创建脚本是逐行执行的,而不是逐句执行:

创建脚本

我使用 SQL 剪贴簿编辑器在 Eclipse 内的同一数据库连接上成功测试了此脚本。

但是当从 JPA 调用时,会发生这种情况:

来自数据库的日志/错误消息

问:有没有办法将创建脚本格式化为人类可读但同时可以作为创建脚本执行?