相关疑难解决方法(0)

JPA hashCode()/ equals()两难

这里有一些 关于JPA实体的讨论,以及哪些hashCode()/ equals()实现应该用于JPA实体类.大多数(如果不是全部)它们依赖于Hibernate,但我想讨论它们JPA实现中性(顺便说一下,我使用的是EclipseLink).

所有可能的实现都有各自的优点缺点:

  • hashCode()/equals()合同一致性(不变性)为List/ Set操作
  • 是否可以检测到相同的对象(例如来自不同会话,来自延迟加载的数据结构的动态代理)
  • 实体是否在分离(或非持久)状态下正常运行

据我所知,有三种选择:

  1. 不要覆盖它们; 依靠Object.equals()Object.hashCode()
    • hashCode()/ equals()工作
    • 无法识别相同的对象,动态代理的问题
    • 分离实体没有问题
  2. 根据主键覆盖它们
    • hashCode()/ equals()坏了
    • 正确的身份(适用于所有管理实体)
    • 分离实体的问题
  3. 根据Business-Id(非主键字段;外键怎么办?)覆盖它们.
    • hashCode()/ equals()坏了
    • 正确的身份(适用于所有管理实体)
    • 分离实体没有问题

我的问题是:

  1. 我错过了一个选项和/或pro/con点吗?
  2. 您选择了什么选项?为什么?



更新1:

通过" hashCode()/ equals()被破坏",我的意思是连续hashCode()调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破ObjectAPI文档,但是当试图从检索改变实体引起的问题Map, Set或其他基于哈希的Collection.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …

java identity hibernate jpa eclipselink

296
推荐指数
9
解决办法
8万
查看次数

JPA @PostPersist 用法

我有一个持久化实体对象的方法 persistData()。我有另一种方法 findData() ,它对持久化的主键值在同一个实体类上执行 find() 操作。当我在实体类的@PostPersist 中调用 findData() 时,我得到一个空指针异常。这在我的脑海中引发了几个问题:

  1. 为什么会出现空指针错误?
  2. @PostPersist 在现实中有什么用?
  3. @Postpersist 什么时候被调用?提交之后,提交期间还是提交之前?

任何进一步的见解也将不胜感激。请在下面找到相关代码和堆栈跟踪:

public void persistData(){
        EntityManagerFactory fac= Persistence.createEntityManagerFactory("test");
        EntityManager man = fac.createEntityManager();

        Employee e = new Employee();
        e.setEmpId(500);
        e.setEmpName("Emp5");
        e.setSalary(5000);
        man.getTransaction().begin();
        man.persist(e);
        man.getTransaction().commit();
        man.close();

    }



public void findData(){
        EntityManagerFactory fac= Persistence.createEntityManagerFactory("test");
        EntityManager man = fac.createEntityManager();

        Employee e=man.find(Employee.class, 500);
        System.out.println(e.getEmpName());
        man.close();    
    }

@PostPersist
public void getData(){
    new Service().findData();
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪(部分):

Exception in thread "main" javax.persistence.RollbackException: java.lang.NullPointerException
    at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:120)
    at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60)
    at Service.persistData(Service.java:18)
    at Service.main(Service.java:34)
Caused by: java.lang.NullPointerException
    at …
Run Code Online (Sandbox Code Playgroud)

lifecycle jpa callback

4
推荐指数
1
解决办法
2万
查看次数

标签 统计

jpa ×2

callback ×1

eclipselink ×1

hibernate ×1

identity ×1

java ×1

lifecycle ×1