在hibernate中实现自己定义类型,仅仅要实现UserType接口就可以或者以Component的形式提供.JPA的@Embedded有点类似,通过此凝视能够在你的Entity中使用一般的java对象,此对象须要用@Embeddable标注
举个简单样例:Person类有一个name属性,name应该有firstName,lastName两个属性,一般的写法直接在entity中写两个属性:
private String firstName;
private String lastName;
我们能够用一个Name类来取代这种写法,此类包括了firstName和lastName,如此一来,我们在entity仅仅要这样写:
private Name name;
就能够了.那么Name类大概是什么样呢?例如以下:
import java.io.Serializable;
import javax.persistence.Embeddable;
@Embeddable
public class Name implements Serializable {
private String firstName;
private String lastName;
public Name() {
}
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return firstName+" "+lastName;
}
}
值的注意的是:
1.必需要实现serializable接口
2.须要有无參的构造函数
3.@Embeddable凝视,表示此类能够被插入某个entity中
还没完!Person类中的name属性须要与数据库表中的first,last两个字段进行映射,例如以下:
@Embedded
@AttributeOverrides( {
@AttributeOverride(name = "firstName", column = @Column(name = "first_name")),
@AttributeOverride(name = "lastName", column = @Column(name = "last_name")) })
public Name getName() {
return name;
}
通过@AttributeOverride凝视来指定Name类的firstName,lastName与数据库中表的first_name,last_name进行映射.
非常easy吧,看起来蛮爽的.可发现一个不大不小的缺点,比方,我要查询一个姓名dennis zane的人,假设是hibernate,我或许这样做:
session.createQuery("from Person p where p.name=?").setParameter(0,name).list();
Hibernate将自己主动将你的自己定义类型进行匹配,可假设我在JPA中这样写:
em.createQuery("select p from Person p where p.name=:name").setParameter("name",name);
查询出错...郁闷,把整个name对象作为查询參数传进去就出错,我非要这样写:
em.createQuery("select p from Person p where p.name.firstName=:name1 and p.name.lastName=:name2").setParameter("name1",name.getFirstName()).setParameter("name2",name.getLastName);
这是需要映射自己Name每个属性.
版权声明:本文博客原创文章,博客,未经同意,不得转载。