在Hibernate中,load方法会访问数据库。

11 浏览
0 Comments

在Hibernate中,load方法会访问数据库。

我理解Hibernate中的session.load()方法。\n

Employee emp = (Employee) session.load(Employee.class, new Long(1));

\n上面的代码只会返回一个代理对象,直到对emp对象调用任何方法之前都不会访问数据库。\n我读到说,如果我调用标识符,即emp.getId(),那么也不会发生数据库调用。但是当我运行时,即使我在Employee类中有以下内容,它仍然调用了数据库。\n

@Id
private Long id; 

\n请告诉我我做错了什么。

0
0 Comments

在Hibernate中,当我们调用getId()方法时,如果注解被放在字段上而不是放在getter方法上,就会导致代理对象被初始化。Hibernate直接访问字段,而不把getter方法视为访问实体的持久状态的方式。因此,在执行方法之前,状态会被加载。

这个问题的解决方法是,将注解放在getter方法上,而不是字段上。这样Hibernate会将getter方法视为访问实体持久状态的方式,而不会直接访问字段。这样就避免了代理对象的初始化。

下面是修改后的代码示例:

@Entity
@Table(name = "my_entity")
public class MyEntity {
    private Long id;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    // other fields and methods
}

通过将注解放在getter方法上,我们成功避免了代理对象的初始化,从而解决了这个问题。

0