即使我们不在实体中提供setter方法,session.get()如何初始化对象

时间:2018-04-20 06:42:35

标签: hibernate

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

}

1 个答案:

答案 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)方法访问属性,而不使用反射。在这种情况下,吸气剂和固定器都应该存在。