JPA注释@Column的原理是什么?没有调用字段的get方法吗?

时间:2017-10-24 03:39:28

标签: java hibernate spring-data

它是如何获得现场价值的?不是通过现场get方法吗?当我使用hibernate * .hbm.xml时,它总是运行字段的get方法来获取值,但@Column不是。@Entity @Table(name = "rank") public class Rank implements Serializable { private static final long serialVersionUID = 1673403567289141704L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(name = "user_id") private Integer userId; @Column(name = "rank_key") private String key;//like 25_1508757477589 @Column(name = "data") private String data; @Column(name = "type") private Integer type; @Column(name = "date") private Date shareDate;//this field can't get value

    public void setShareDate(Date shareDate) {
        this.shareDate = shareDate;
    }

    public Date getShareDate() { //get timestamp through key
        String[] split = key.split("_"); 
        Long time = Long.parseLong(split[1]);
        return new Date(time);
    }
}

//其他字段getter和setter

Rank.hbm.xml

当我使用shareDate时,字段get可以调用getShareDate方法获取值(将运行<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="*.Rank" table="rank"> <id name="id" type="int"> <generator class="identity"/> </id> <property name="userId" type="int" column="user_id"></property> <property name="key" type="string" column="rank_key"/> <property name="data" type="string" column="data" /> <property name="type" type="int" column="type"></property> <property name="shareDate" type="java.util.Date" column="date"></property> </class> </hibernate-mapping> 方法),我是否遗漏了某些内容?

def encode(self, password, salt, iterations=None):
    if iterations is None:
        iterations = self.iterations
    # then ur code......

2 个答案:

答案 0 :(得分:0)

有两种访问类型:属性访问和字段访问。

来自Pro JPA2

  

如果您注释字段,JPA提供程序将获取并设置字段   使用反射的实体。如果注释设置在   getter方法的属性,那些getter和setter方法都是   由提供者调用以访问和设置状态。

     

注释实体的字段将导致提供程序使用   字段访问以获取和设置实体的状态。吸气鬼和二传手   方法可能存在也可能不存在,但如果它们存在,则存在   被提供者忽略。

     

使用属性访问模式时,与JavaBeans的合同相同   适用,并且必须有getter和setter方法   持久性。

与hbm(hibernate mapping)XML相同的情况。 property元素具有access属性。其值可以是字段属性。如果未定义,则默认为属性

HBM将始终覆盖注释。

现在,让我们检查您的代码。 您已在字段上添加@Column注释(而不是在getter方法上)。在这里,您正在使用字段访问。但是,您还有一个HBM xml文件,默认情况下HBM使用属性访问,并且它会覆盖注释。最后,您使用属性访问(而不是字段访问)。这就是调用getter方法获取值的原因。否则,如果使用字段访问,则通过反射捕获值。

如果您要询问@Column注释的目的是什么。阅读API文档。它基本上将您的实体字段/属性映射到物理表中的特定列。这是可选的,如果您不声明,则默认值将适用。有关默认值的更多信息,请参阅API。

答案 1 :(得分:0)

感谢所有观众,我已经能够获得'shareDate'属性值,我在getter函数上更改了所有JPA注释,它对我有用。但我真的想知道@Column如何获得pojo字段的价值。