hibernate实体在“同一范围”中等于var null和not null

wpx232ag  于 2021-07-04  发布在  Java
关注(0)|答案(2)|浏览(363)

我在挣扎 equals 我的休眠实体。。。
或者说:我不知道,为什么是身份证 Integer id 正确打印在 toString 但范围相同 System.out.println(id) -> null 为什么?
我试过用bouth lazy 以及 eager 在entityconfig中,但行为相同。
那是我的课:

@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
.....
@Override
    public boolean equals(Object o) {
        System.out.println("------------------------------------------------");
        System.out.println("THIS: " + getClass().toString());
        System.out.println("O: " + o.getClass().toString());
        System.out.println("THIS: " + getClass().getClassLoader().toString());
        System.out.println("O: " + o.getClass().getClassLoader().toString());

        if (this == o)
            return true;
        if (o == null)
            return false;
        if(!(o instanceof Workstation)){
            return false;
        }
        Workstation that = (Workstation) o;
        System.out.println("THIS TO STRING: " + this.toString());
        System.out.println("THAT TO STRING: " + that.toString());
        System.out.println("THIS ID: " + this.id);
        System.out.println("THAT ID: " + that.id);
        System.out.println("THIS ID: " + this.id + " T");
        System.out.println("THAT ID: " + that.id + " T");
        System.out.println("ERGEBNIS: " + (id.equals(that.id)));
        System.out.println("------------------------------------------------");
        return id.equals(that.id);
    }

    @Override
    public String toString() {
        if (name != null)
            return id + " - " + name + " ";
        return "FEHLER WORKSTATION";
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

这就是问题所在:

------------------------------------------------
THIS: class com.wulf.system.mes.model.Workstation
O: class com.wulf.system.mes.model.Workstation$HibernateProxy$ycosLiwl
THIS: org.springframework.boot.devtools.restart.classloader.RestartClassLoader@66e4c786
O: org.springframework.boot.devtools.restart.classloader.RestartClassLoader@66e4c786
THIS TO STRING: 5 - Zuschnitt <- TO STRING
THAT TO STRING: 5 - Zuschnitt <- TO STRING -- ID is 5 BUT
THIS ID: 5
THAT ID: null <- if I want to print the id of Object "That" I get null WHY?!
THIS ID: 5 T
THAT ID: null T
ERGEBNIS: false
------------------------------------------------
pw9qyyiw

pw9qyyiw1#

所以答案很简单-对象没有保存到数据库中。在tostring()中调用id时不会生成id。
因此,请尝试先保存实体,然后执行其findbyid作为示例并调用tostring。我确信在这种情况下我不会是空的。

9njqaruj

9njqaruj2#

注意日志中工作站的类信息。第一个是您的workstation类,另一个是由hibernate生成的workstation类的代理。

THIS: class com.wulf.system.mes.model.Workstation
O: class com.wulf.system.mes.model.Workstation$HibernateProxy$ycosLiwl

hibernate生成的代理类将其所有方法调用委托给目标对象。因此,当调用tostring方法时,它会调用实际工作站对象上的tostring方法。真正的工作站对象带有id和name值并打印出来。
另一方面,当调用that.id时,它会尝试并获取代理类上的id值。hibernate代理类上的字段值始终为空。
解决方案
使用getter方法。

System.out.println("THAT ID: " + that.getId());
System.out.println("ERGEBNIS: " + (id.equals(that.getId())));

相关问题