JPA的Embeddable Objects[ 2006-11-14 18:27:56 | 作者: LALFASHI ]
在hibernate中实现自定义类型,只要实现UserType接口即可或者以Compnent的形式提供.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类大概是什么样呢?如下: package com.denny_blue.ejb3.entity; 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
通过@AttributeOverride注释来指定Name类的firstName,lastName与数据库中表的first_name,last_name进行映射.@AttributeOverrides( { @AttributeOverride(name = firstName, column = @Column(name = first_name)), @AttributeOverride(name = lastName, column = @Column(name = last_name)) }) public Name getName() { return name; } 很简单吧,看起来蛮爽的.可发现一个不大不小的缺点,比如,我要查询一个姓名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的每一个属性. |
|
来自: minwh > 《Hibernate》