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