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实现中有同样问题还有待测试。
相关推荐
微微撒 2020-03-08
东方咖啡屋 2020-03-01
suixinsuoyu 2020-01-31
lcwben 2020-01-08
melonjj 2020-06-26
zhongliwen 2020-06-25
haidaoxianzi 2020-06-20
jediaellu 2020-06-02
Danialzhou 2020-05-30
meleto 2020-05-30
geek00 2020-05-27
TNTMysql工程师 2020-05-12
URML 2020-05-09
lclcsmart 2020-03-26
Pinkr 2020-03-12
whbing 2020-02-21
haidaoxianzi 2020-02-20
neweastsun 2020-02-18