【问题标题】:JPA entities and equals method on abstract entity抽象实体上的 JPA 实体和 equals 方法
【发布时间】:2011-10-20 08:16:55
【问题描述】:

我有一个抽象实体类,它实现了 3 个略有不同的实体。在我的 3 个子类中,我重写了 equals 并具有方法,但问题是,我是否也应该在抽象实体中这样做?如果我不这样做,除非我强制转换它们,否则我将无法比较仅由抽象实体定义的实体。如果我做平等,我会冒险与不同的子实体进行比较并得到它们相似吗?

例子:

abstract class Log{}
SystemLog extends Log{}
UserLog extends Log{}

    public void test(Log log){
        Log myInner = new SystemLog();
        if(log.equals(myInner)){
            //do random stuff
        }
    }

【问题讨论】:

    标签: jpa equals abstract entities


    【解决方案1】:

    我看不出投射有问题。 equals 的参数类型是 Object,因此您必须强制转换才能访问属性。

    如果在每个子类中定义equals方法,什么时候会调用抽象超类中的equals方法?

    如果我做一个equals,我会冒险与不同的子实体进行比较并且 知道他们是一样的

    无论如何,您都有将不同子实体相互比较的风险。想象一下 Set 与超类作为类型填充的对象是两个不同子类的两个实例。与是否覆盖超类中的equals没有太大关系。

    在您的示例中,如果我们在实际子类中已经实现,则不会调用可能在抽象类 Log 中实现的 equals 方法:

    假设:

    UserLog extends Log{
        public boolean equals(Object o) {
            //I do override equals method so I am one who is called.
            //and here you go and check type with something like
        if (this == o) return true;
        if (!(o instanceof UserLog)) return false;//accepts subclasses of UserLog
         ....
        }
      ...
    }
    
    //And then somewhere else
      Log ul = new UserLog();
      test(ul);
    

    【讨论】:

    • 我添加了一个我的情况的例子
    • 另外,在您的示例中,如果在子类中重写了 equals 方法,则不会调用抽象类 Log 中的 equals 方法。这与此层次结构实体中的类没有太大关系,只是简单的方法覆盖。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2011-09-25
    • 2011-07-08
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多