问题标签 [entitymanager]
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.
java - 您可以从 EntityListeners 访问 EntityManagers 吗?
我知道 JSR-000220 Enterprise JavaBeans 3.0 Final Release (persistence) 规范指出:
“一般而言,可移植应用程序不应调用 EntityManager 或 Query 操作、访问其他实体实例或修改生命周期回调方法中的关系。”
这看起来非常严格。我们有一种情况,我们想从 EntityListener 中访问 EntityManager。
在 Jboss/Glassfish 或任何其他应用程序服务器上的侦听器中使用 EntityManager 时,是否有人遇到过任何不利影响/缺陷?
mysql - JPA EntityManager 使用区分大小写的键查找
我正在尝试使用 JPA EntityManager find() 方法。我的主键是一个与用户名相对应的字符串。
我正在使用 JPA / Hibernate / MYSQL。
我的问题是搜索用户 'David' 匹配用户 'david',我认为是由于底层 MYSQL 中不区分大小写的字符串匹配。这给我带来了一大堆问题!
有没有人对此有一个优雅的解决方案?我可以进行本机 SQL 调用并使用此处记录的 BINARY 运算符:http: //dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html
有人有更好的解决方案吗?塔。
hibernate - 如何更改 JPA 中的实体类型?
在我的具体情况下,我正在使用鉴别器列策略。这意味着我的 JPA 实现(Hibernate)创建了一个带有特殊DTYPE列的用户表。此列包含实体的类名。例如,我的users表可以有TrialUser和PayingUser的子类。这些类名将在DTYPE列中,以便 EntityManager 从数据库加载实体时,它知道要实例化哪种类型的类。
我尝试了两种转换实体类型的方法,都感觉像肮脏的黑客:
- 使用本机查询手动对列执行更新,更改其值。这适用于属性约束相似的实体。
- 创建目标类型的新实体,执行BeanUtils.copyProperties()调用以移动属性,保存新实体,然后调用命名查询,该查询手动将新 Id 替换为旧 Id,以便所有外键约束得到维护。
#1 的问题是,当您手动更改此列时,JPA 不知道如何将此实体刷新/重新附加到持久性上下文。它需要一个ID 为 1234 的TrialUser,而不是一个 ID 为 1234 的PayingUser。它失败了。在这里,我可能会做一个 EntityManager.clear() 并分离所有实体/清除 Per。上下文,但由于这是一个服务 bean,它会擦除系统所有用户的未决更改。
#2 的问题是,当您删除TrialUser时,您设置为 Cascade=ALL 的所有属性也将被删除。这很糟糕,因为您只是试图交换不同的用户,而不是删除所有扩展对象图。
更新 1:#2 的问题使我几乎无法使用它,所以我放弃了尝试让它工作。更优雅的 hack 绝对是 #1,我在这方面取得了一些进展。关键是首先获取对底层 Hibernate Session 的引用(如果您使用 Hibernate 作为 JPA 实现)并调用 Session.evict(user) 方法从持久性上下文中仅删除该单个对象。不幸的是,没有纯粹的 JPA 支持。这是一些示例代码:
请注意引发此异常的手动flush() :
您可以看到User具有 OneToMany 集的Membership实体导致了一些问题。我对幕后发生的事情知之甚少,无法破解这个坚果。
更新 2:到目前为止唯一有效的方法是更改 DTYPE,如上面的代码所示,然后调用entityManager.clear()
我不完全理解清除整个持久性上下文的后果,我希望让Session.evict()处理正在更新的特定实体。
hibernate - JPA EntityManger 在合并时执行数据库插入?
我在下面使用带有 Hibernate 的 JPA,我无法让合并工作,但在我描述我在使用 JPA 时遇到的问题之前,让我列出我想要完成的工作,以防万一我的问题源于我的方法.
我有来自系统的数据,需要放入另一个系统。为此,我正在读取数据,然后基于该数据构造新的 ORM 对象,然后我想将 ORM 对象持久保存到数据库中。现在,当数据库为空时,程序可以正常运行,只需调用 em.persist(object) 即可。但是,我希望能够在数据库中有数据时运行此过程,添加新数据并根据需要更新旧数据,这就是我遇到问题的地方。
我做一个简单的检查,看看该项目是否已经存在于数据库中,如果没有找到,我坚持,如果记录存在,我尝试合并。失败并出现重复记录错误;
让我感到奇怪的是 em.merge() 调用正在尝试插入而不是更新(我通过 SQL 日志记录确认了这一点)。
我应该注意我正在使用级联成子对象的对象。失败发生在子对象上,这对我来说很有意义,因为我希望它首先尝试合并子对象。
以下是我的代码,请原谅粗略的状态,我已尝试在此处记录一些解决方法。
如果有 JPA 经验的人可以帮助我,我将不胜感激。Hibernate 的 saveOrUpdate() 和 JPA 的 merge() 之间的差异显然让我感到困惑,但是尽管阅读了几篇关于 EnityManger 合并的文章,我仍然无法理解这里发生的事情。
谢谢你的时间。
java - 我如何将 EntityManager 传递给@PostUpdate
我想保存更改的历史记录,所以在@PostUpdate 我想创建另一个实体的新实例并保存它,我如何将 EntityManager 传递给该方法?
java - 如何使用 JPA/EclipseLink 从联结表中获取信息?
我有以下多对多映射:
}
public class Cat implements { @Id @GeneratedValue private Integer yID;
}
请忽略对象和属性名称,它们是虚构的和不相关的。这可以编译并正常工作。我也可以这样做:
当我从数据库中取回对象时,我的问题就来了。
打印输出是:
3:{IndirectSet:未实例化}
2:{IndirectSet:未实例化}
这很可能是正常行为。在我看来,当我从表中取回对象时,应该填充与其他对象相关的集合。我的意思是,因为连接表看起来像这样:
X | 是
2 | 3
1 | 3
em.find(Cat.class,3) 应该为 getStudents() 返回一个带有一组 {1,2} 的 Cat 对象,而 em.find(Student.class,2) 应该返回一个带有一组 {3 的 Student 对象} 对于 getCats()。
有没有办法让这成为可能?
谢谢, BJ
seam - 远程接缝持久性
我在.xhtml 文件中有一个按钮,它调用一个远程调用java 函数的javascript 函数(在jboss seam 环境中)。该 java 函数有一个 entityManager.persist(object)。你知道为什么这行代码不提交到数据库吗?它表示事务尚未开始。我假设在远程上下文中我没有开始事务,因为如果我在调用相同 java 函数而不是使用上面的 javascript 的那个按钮上放置一个动作,它工作正常;entityManager 持久化对象,我可以在数据库中看到它。
有谁知道我如何才能使用javascript调用java函数来实际持久化对象?(我必须使用 javascript 因为我需要回调函数)
java - 在 Spring MVC 应用程序中修复 Null EntityManger?
在下面的代码中,我注入的 EnitityManager 有问题,它总是显示为 null;
这是在dispatcher-servlet.xml中定义的 bean 定义。
EnitityManager 应该基于 tx:annotation-based 注入,在persistence-context.xml文件中定义。
持久性上下文是从applicationContext.xml加载的
类路径导入已完成,因为 ORM 实体作为 JAR 文件包含在项目中。请注意,我相信持久性上下文正在加载,因为如果 Spring 无法解析其配置文件,它将不允许部署应用程序。
这是我的persistence.xml。
还有我的web.xml
有谁可以帮我离开这里吗?
java - 在这种情况下是否有必要调用 flush()(JPA 接口)?
因为调用一个 flush() 来让每个实体从内存持久化到数据库。因此,如果我调用过多不必要的 flush(),可能会花费很多时间,因此对于性能来说不是一个好的选择。这是一个我不知道何时调用flush()的场景?
我的问题是:是否可以避免跟注一号同花?
我担心的是:为了执行item.setOrder(ord),我们需要一个 ord 的数据库 id。并且仅调用em.persist(ord)无法生成数据库 ID,因此我必须在item.setOrder(ord)之前调用em.flush( ) 。那么小伙伴们有什么看法呢?
提前致谢。
jpa - JPA EntityManager:为什么使用persist()而不是merge()?
EntityManager.merge()
可以插入新对象并更新现有对象。
为什么要使用persist()
(只能创建新对象)?