抽象实体上的JPA实体和equals方法

抽象实体上的JPA实体和equals方法,jpa,equals,abstract,entities,Jpa,Equals,Abstract,Entities,我有一个抽象实体类,由3个稍微不同的实体实现。在我的3个子类中,我覆盖了equals和has方法,但问题是,我是否也应该在抽象实体中这样做?如果我不这样做,我将无法比较仅由抽象实体定义的实体,除非我强制转换它们。如果我做了一个等式,我会冒险比较不同的子实体,得出它们是一样的吗 例如: abstract class Log{} SystemLog extends Log{} UserLog extends Log{} public void test(Log log){

我有一个抽象实体类,由3个稍微不同的实体实现。在我的3个子类中,我覆盖了equals和has方法,但问题是,我是否也应该在抽象实体中这样做?如果我不这样做,我将无法比较仅由抽象实体定义的实体,除非我强制转换它们。如果我做了一个等式,我会冒险比较不同的子实体,得出它们是一样的吗

例如:

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
        }
    }

我看不出铸造有什么问题。equals的参数类型是Object,所以您必须强制转换才能访问属性

如果在每个子类中定义equals方法,那么何时会出现在抽象超类中调用equals的情况

如果我做了一个相等的比较,我会冒险与不同的子实体和 我知道他们很像

无论如何,您都有可能将不同的子实体相互比较。想象一下,Set with superclass是一个填充了两个不同子类的两个实例的对象的类型。这与是否重写超类中的等于并没有太大关系

在您的示例中,如果我们已经在实际子类中实现了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方法,则不会调用抽象类日志中的equals方法。这与该层次结构中的类是否为实体没有太多关系,只是简单地重写了方法。