`
yourenyouyu2008
  • 浏览: 286094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在自定义方法equals中发现的问题,慎用对象的私有属性。

JPA 
阅读更多

下面的类是所有实体(jpa entity)的父类,所有实体的比较都有该类实现。

当使用延迟加载时会出现问题,延迟加载时比较的并不是实体本身,而是实体的拦截实例,他是实体的子类,

other.id并没有值,正常情况下是通过 other.getId()来访问id的,拦截实例会调用他包装的实体类的 getId()。

 

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "SERIESTYPE_SEQ")
    private SeriesType seriesType;

public abstract class BaseEntity implements Serializable

 

    private Long id;

    public Long getId() {
        return id;
    }

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

有bug的方法

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof BaseEntity))
            return false;
        final BaseEntity other = (BaseEntity) obj;
        if (getId() == null) {
            if (other.getId() != null){
                return false;               
            }
        } else{
            if (!getId().equals(other.id )){
                return false;
            }
        }
           
        return true;
    }

修改过后的方法

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof BaseEntity))
            return false;
        final BaseEntity other = (BaseEntity) obj;
        if (getId() == null) {
            if (other.getId() != null){
                return false;               
            }
        } else{
            if (!getId().equals(other.getId() )){
                return false;
            }
        }
           
        return true;
    }

要避免直接使用对象的私有属性

分享到:
评论

相关推荐

    java 反射取得类的私有属性,通过私有属性取得属性值

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和方法,即使这些属性或方法是私有的。这篇博客文章可能讨论了如何利用反射机制来获取类的私有属性并读取其对应...

    C#使用Equals()方法比较两个对象是否相等的方法

    为了在自定义类中实现基于内容的相等比较,你需要重写`Equals()`方法,并可能同时重写`GetHashCode()`方法以保持一致性。下面是一个简单的例子: ```csharp public class Product { public string Name { get; set...

    equals方法的重写.docx

    为了使对象之间能够基于内容进行比较,通常需要在具体的类中重写`equals`方法。 #### 二、为什么需要重写equals方法? 1. **提高程序效率**:当两个对象具有相同的业务逻辑上的“身份”时,它们应该被认为是相等的...

    js equals方法

    自定义`equals`方法时,应考虑对象属性的顺序以及处理循环引用的情况,以免陷入无限递归。此外,如果对象包含`undefined`值,可能需要特殊处理,因为`undefined`在JavaScript中与其他类型的值比较时会有特殊行为。 ...

    spring 自定义属性编辑器

    在Spring框架中,属性编辑器(PropertyEditor)是一种强大的工具,允许我们自定义类型转换过程。当我们需要将字符串形式的数据转换为Java对象时,属性编辑器就发挥了关键作用。例如,从请求参数或配置文件中读取的...

    java中的==和equals()方法1

    在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...

    set接口经常用的hashCode和equals方法详解

    在这个例子中,`equals`方法根据`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode`方法也综合考虑了这两个属性,以确保`equals`方法返回`true`的对象具有相同的哈希码。 #### 七、总结 在Java中,...

    Java对象属性数据比较,返回变化数据

    在Java编程中,比较对象属性的数据变化是一项常见的需求,特别是在数据跟踪、日志记录或版本控制等场景。本文将深入探讨如何实现这个功能,并基于给定的文件`PriceCheckDetail.java`和`ObjectCompareUtil.java`来...

    重写toString和equals方法

    在 Java 中,每个对象都继承自 Object 类,而 Object 类中定义了两个重要的方法:toString() 和 equals()。这两个方法都是非常重要的,它们分别用于对象的字符串表示和对象比较。然而,在大多数情况下,我们需要重写...

    重写equals方法

    在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用,但是这并不满足实际需求...

    写一个类Student,包含三个属性学号id,姓名name和年龄age;要求覆盖基类Object中的ToString()方法和Equals()方法,使得直接输出Student对象时输出的是对象的id,name和age信息;并且当两个对象的学号相同时认为它们相等;

    要求覆盖基类Object中的ToString()方法和Equals()方法,使得直接输出Student对象时输出的是对象的id,name和age信息;并且当两个对象的学号相同时认为它们相等; 然后写一个主方法测试以上定义。

    equals问题经典

    在Java编程语言中,`equals()`方法是用来比较两个对象的内容是否相等的,而`==`操作符则是用来比较两个变量是否引用同一个对象。这里我们将深入探讨`equals()`方法的用法,以及它与`==`的区别,同时解决题目中提出的...

    java中hashcode()和equals()方法详解

    为了使得`equals()`方法更加有用,程序员通常会在自定义类中覆盖此方法,以根据类的具体属性来判断两个对象是否相等。 **2.1 `equals()`的作用** - **对象相等性的判定**: `equals()`方法提供了一种机制,使得我们...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    Java自定义实现equals()方法过程解析

    然而,在实际开发中,我们经常需要自定义equals()方法来比较我们自己定义的对象。 在自定义equals()方法时,我们需要遵循一些规则,以确保我们的equals()方法是正确的。首先,我们需要检查被比较的对象是否是同一个...

    C# Equals 和 GetHashCode 方法重写

    在C#编程中,`Equals` 和 `GetHashCode` 方法是非常重要的成员方法,它们对于确保对象的正确比较以及高效地存储和检索对象至关重要。这两个方法通常需要在自定义类中进行重写,以满足特定业务逻辑的需求。 #### 1. ...

    关于java中对象属性值的校验的思考

    在Java编程中,对象属性值的校验是一个重要的实践环节,它确保了程序的数据完整性,防止因非法数据导致的运行时错误。这篇文章将探讨如何在Java中进行对象属性值的校验,以及相关的工具和源码分析。 首先,对象属性...

    详解JavaScript 新语法之Class 的私有属性与私有方法

    直到ES2019,JavaScript的Class功能相对成熟,但仍有一些面向对象编程中常见的特性尚未被支持,例如私有属性和私有方法。在近年来,ECMAScript 提案,如 proposal-class-fields 和 proposal-private-methods,一直在...

    Android自定义属性

    在Android开发中,自定义属性是一种非常常见的技术,它允许开发者扩展系统提供的组件特性,创建具有独特功能和外观的自定义视图或者组件。通过自定义属性,开发者可以更好地控制UI设计,提升应用的用户体验。以下是...

    Java中equals方法隐藏的陷阱

    如果不做这个检查,而直接调用`equals`方法或访问对象属性,则会导致`NullPointerException`。 **示例代码**: ```java public boolean equals(Object obj) { if (obj instanceof MyClass) { MyClass other = ...

Global site tag (gtag.js) - Google Analytics