session.get()如何从数据库初始化对象,即使我们不在实体中提供setter方法。
在我的UserDetails类中,我没有使用setter方法,但hibernate是如何初始化userName成员变量的。
主要课程:
package org.hibernatetest.demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.demo.UserDetails;
public class HibernateTest {
public static void main(String[] args) {
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
session.beginTransaction();
UserDetails user=(UserDetails)session.get(UserDetails.class,1);
System.out.println(user.getUserName());
session.getTransaction().commit();
session.close();
}
}
UserDetails类:
package org.hibernate.demo;
import java.util.Date;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
@Entity
public class UserDetails {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int userId;
private String userName;
public String getUserName() {
return userName;
}
}
答案 0 :(得分:0)
标准是ID的映射方式。因此,当您在FIELD上放置@Id
注释时,所有访问都将通过FIELD(持久性提供程序使用Reflection)进行,当ID映射到getter / setter方法时,所有类的FIELD都将使用getter / setter方法。
在您的应用程序中,您将FIELD注释如下,因此您的实体具有基于FIELD的访问权限
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private int userId;
因此,持久性提供程序运行时使用The Reflection API直接访问FIELD。 因此,您无需以任何方式提供制定者或吸气剂。
如果使用@Id
注释注释getter方法,则Persistence提供程序将通过getter(Accessor)和setter(Mutator)方法访问属性,而不使用反射。在这种情况下,吸气剂和固定器都应该存在。