loading ...
loading...

2006-09-01 | JPA的Embeddable Objects(5)

分享

在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
 @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进行映射.

很简单吧,看起来蛮爽的.可发现一个不大不小的缺点,比如,我要查询一个姓名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的每一个属性.

分享 分享 |  评论 (0) |  阅读 (?)  |  固定链接 |  类别 (Java) |  发表于 10:51  | 最后修改于 2006-09-01 14:36
搜狐博客温馨提示:警惕博客留言诈骗, 搜狐博客管理员的正确地址为http://admin.blog.sohu.com, 其他都是冒牌。搜狐博客官方不会要求参加活动的各位博友缴纳任何的手续费用。请勿轻信留言、评论中的中奖信息,更不要拨打陌生电话及向陌生帐户汇款,谨防受骗!识别更多网络骗术,请 点击查看详情
您还未登录,只能匿名发表评论。或者您可以 登录 后发表。
 
  一个单亲妈妈的心愿:治好7岁儿子的白血病
表  情:
加载中...
回复通知: 同时用小纸条通知对方该回复