JPA(HIBERNATE)关于ENTITY class 的一处疑问

最近一段时间在学习JPA,我使用的是HIBERNATE3的实现,在编写ENTITY的时候发现一处问题,或许很小白,但还是在这里和大家共享一下吧。

在写@Column标记时,JPA有两种方式:一是标注于对应的属性处,二是标注于对应属性的get方法处。如果当前的ENTITY内有不打算持久化的属性,则应当标注@Transient标记以表示该属性不会用于持久化。但在具体使用时,我还发现了一个问题,那就是如果当前ENTITY内的有getXXX方法,但却没有对应的属性,则在运行具体的merge或persist方法时,程序会出错。所以如果有getXXX方法而没有对应的属性时,也应当在该方法上标注@Transient标记。

示例如下:

@Entity
@Table(name="xxx")
public class NewClass implements Serializable{

    private Integer id;

    private String name;

    private String abc;

    @Id
    @Column(name="id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // abc 不打算持久化,因而标注Transient
    @Transient
    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }

    // 注意,这里就是可能导致问题的地方,如果不标注Transient标记,hibernate jpa会认为
    // 该类有一个名为 newName的属性,从而在同步时为其赋值,但却发现无该属性,从而报
    // org.hibernate.PropertyNotFoundException: Could not find a setter for property newName in class com.egf.entity.NewClass
    @Transient
    public String getNewName(){
        return name+abc;
    }
}

我做过尝试,对于getNewName方法,如果为其改名为不以get开头,则程序可以顺利通过,否则就应为其标注@Transient标记。

再次声明,这个问题是我在hibernateJPA下发现的,是否在其他JPA实现中有同样问题还有待测试。

相关推荐