相关疑难解决方法(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万
查看次数

为具有生成ID的实体实现equals()时的最佳实践是什么

如果我有一个包含A,B,C,D列的表
 :自动生成的id(PK)
 B&C:组合必须是唯一的(这些是在商业意义上实际定义身份的列)
 D:其他一些列

现在,如果我将基于此表创建业务对象(例如,在Java中),哪一个将是equals()方法的更好实现:

  1. 基于A定义相等性
  2. 基于B和C定义相等性

或者,我选择哪两个并不重要.

java hibernate

12
推荐指数
1
解决办法
4406
查看次数

Hibernate中equals()方法的问题

我正在Hibernate中开发一个应用程序,我有这样的模型类:

public class Employee
{
    private int ID;
    private String name;
    private Department department;
    //other properties
    //constructors, getters and setters
}
Run Code Online (Sandbox Code Playgroud)

请注意,该ID值不是用户填充的值,而是使用GenerationType.Identity作为填充的值填充strategy.

我还有另一个课程Department如下:

public class Department
{
    private int ID;
    private String name;

    private Set<Employee> employees; //this is actually a HashSet

    //other implementations
}
Run Code Online (Sandbox Code Playgroud)

a 和a ManyToOne之间存在双向关系.EmployeeDepartment

因此,要向Employee现有内容添加新内容Department,请执行以下操作

Department existingDepartment = ...;
Employee newEmployee = ...;

existingDepartment.addEmployee(newEmployee);
employee.setDepartent(existinDepartment);

session.save(newEmployee);
Run Code Online (Sandbox Code Playgroud)

现在从概念上讲Employee,如果它们具有相同的两个对象是相同的ID.所以我equals() …

java hibernate

6
推荐指数
1
解决办法
1847
查看次数

如何在同一个 Spring Data JPA 保存请求中级联创建和存储引用?

我的Parent实体有一个Child实体和Elements 的集合:

@Entity
public class Parent {
    @Id
    private String id;

    @OneToOne(cascade = CascadeType.ALL)
    private Child child;

    @ManyToMany(cascade = CascadeType.ALL)
    private List<Element> elements;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }

    public List<Element> getElements() {
        return elements;
    }

    public void setElements(List<Element> elements) {
        this.elements = elements;
    }

}
Run Code Online (Sandbox Code Playgroud)

Child …

spring hibernate spring-data spring-data-jpa

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

在Hibernate中存储在Set中时,equals()和hashCode()

在第4.3章的Hibernate文档中." 实现equals()和hashCode() "他们写了这句话:

"此外,如果一个实例未保存并且当前在一个Set中,保存它将为该对象分配一个标识符值.如果equals()hashCode()基于标识符值,则哈希码将改变,违反合同集."

我不明白它打破了什么合同以及可以从中获得什么问题.

java hibernate jpa

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

使用EclipseLink的JPA实体的equals()和hashcode()

使用JPA,我偶然发现了这个问题equals(),并hashcode(),特别是对尚未被持久化新创建的实体.

我在stackoverflow中找到了以下答案:

我应该在JPA实体中编写equals()方法吗?

这个答案谈到了Hibernate会话.我不使用Hibernate(但是EclipseLink),我不知道JPA提供程序的实现细节,例如这些"会话".

我的问题是,就JPA而言,什么是Hibernate会话?或者,更具体的:如果我不覆盖equals(),并hashcode()在这情况下,我会碰到其中两个对象表示相同的实体问题(同一业务键,如果存在的话)不是"平等"(这意味着equals()返回false)?

使用相同的EntityManager实例是否足以避免出现这些问题(这意味着,在此上下文中,"session"和"EntityManager"是否可以等效使用?)

注:我没有为所有表可用业务键,因此该解决方案使用的业务关键属性equals()hashcode()不能应用.

java jpa equals

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

使用hibernate保存/更新对象

我的班级Foo有方法:

 protected void saveMany(Collection<T> many) {  
    for(Object one : many) {
            one = session.merge(one); // also tried this commented out
            session.saveOrUpdate(one); // session.merge(one);   
        }
Run Code Online (Sandbox Code Playgroud)

试图使用saveOrUpdate并合并,但两者都给了我这个例外:

Error: Invocation of method 'saveMany' in class Foo threw exception class org.hibernate.HibernateException : org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [Bar#581301]
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

边注:

当我截断我的表时,保存部分工作,但是当我填充表时,再次运行此方法,从而更新表,它失败,具有此异常

java generics hibernate

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