当前位置: 首页 > 知识库问答 >
问题:

查看任意对象是否为JPA实体的正确方法是什么?

董高洁
2023-03-14

JPA2.1规范的第3.1.1节说:

EntityManager接口的方法[例如Contains(Object)]引发的运行时异常[例如IllegalArgumentException]而不是LockTimeoutException,如果持久性上下文连接到当前事务,则将导致该事务标记为回滚。

那么,在不回滚当前事务的情况下,检查任意对象(不知道它是否是实体,不知道它是否在持久性上下文中)是否既是实体又在持久性上下文中的首选方法是什么?

共有1个答案

华英睿
2023-03-14

您可以在一个新的事务中检查这一点,这不会影响您当前的事务。

这是您上一个问题的一个很好的例子,当时我回答说规范中有一些部分没有正确地制定。我将给你一个例子,它工作起来没有任何问题,这与规范相矛盾(至少在带有Hibernate的JBoss 7.1中):

public class EjbServiceBean implement EjbService {

    @PersistenceContext
    private EntityManager em;

    @Override
    public void testTransaction() {

        //this code is in a transaction EJB method
        MyEntity entity = em.find(MyEntity.class, 1L);
        entity.setPeristentField("New Value");

        try {
            em.find(Class.class, 1);//should rollback the transaction
        } catch (Exception e) {
            //simply catching the Exception, so that the CMT transaction is not rolled back by the EJB container.
        }
    //but after the method returns, the entity instance is commited.
    }
}

对于这个示例,我的意思是,实际上您可以使用em.contains()方法来检查类是否是实体类。

 类似资料:
  • 问题内容: 我很惊讶地发现这种情况总是成立的: 似乎无论最初是什么类型,它都将转换为相应类的实例。是否存在确定对象是否可靠的方法? 问题答案: 更新 我在下面显示的代码被报告在发行版本中不起作用。(请参阅下面的Paul Cantrell的评论。) 对于我的“据我测试”的道歉过于有限。 当我找到关于此的更多信息时,我将更新此答案。 我不确定我们是否可以在下一个Beta(或GM或已发布的版本…)中看到

  • 这是我遇到的一个普遍问题。我想知道是否有人知道任何合适的设计模式或技术。 上面的类从队列中获取外部对象并构造MyBuilderClass对象。 如果所有字段都设置为非null非空值,则成功构建MyBuilderClass对象。 将有许多MyBuilderClass对象无法构建,因为ExternalObject中缺少数据。 我的问题是,检测对象是否已正确构建的最佳方法是什么? 我可以检查set方法中

  • 问题内容: 我的numpy数组用于指定缺少的值。在遍历数据集时,我需要检测这些缺失值并以特殊方式处理它们。 我天真地用过,除非不在所支持的类型子集中,否则它会很好地工作。例如,字符串字段中可能会出现丢失的数据,在这种情况下,我得到: 除了编写昂贵的包装来捕获异常并返回外,还有没有办法优雅而有效地处理此包装? 问题答案: (也是,在较新的版本中)检查数字数组和字符串/对象数组中的缺失值。从文档中,它

  • 问题内容: 我有一个简单的班级角色: 现在,我想重写其方法equals和hashCode。我的第一个建议是: 但是,当我创建新的Role对象时,其id为null。这就是为什么我对hashCode方法实现有一些问题。现在,我可以简单地返回,但是如果没有RoleName字段,该怎么办?我几乎可以肯定,组成更复杂的示例并不难,而通过返回其字段之一的hashCode不能解决该示例。 因此,我想查看一些指向

  • 问题内容: 有没有一种快速的方法来检查对象是jQuery对象还是本机JavaScript对象? 例: 显然,上面的代码有效,但并不安全。您可能会向对象添加选择器键并获得相同的结果。有没有更好的方法来确保该对象实际上是jQuery对象? 符合 问题答案: 您可以使用运算符: 说明 :该函数(又名)被实现为构造函数。构造函数将以前缀调用。 调用时,内部jQuery将此转换为1。JavaScript继续

  • 问题内容: 哪些类型的对象属于“可订阅”范围? 问题答案: 它基本上意味着对象实现了该方法。换句话说,它描述的是“容器”对象,这意味着它们包含其他对象。这包括字符串,列表,元组和字典。