JPA的Embeddable注解

本文介绍如何在JPA中使用@Embeddable注解创建自定义类型,并通过实例展示了如何将复合类型映射到数据库。同时,讨论了查询自定义类型时需要注意的问题。

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

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


转载于:https://my.oschina.net/chaenomeles/blog/526479

Files contained in javax.persistence.jar: META-INF/MANIFEST.MF javax.persistence.Access.class javax.persistence.AccessType.class javax.persistence.AssociationOverride.class javax.persistence.AssociationOverrides.class javax.persistence.AttributeOverride.class javax.persistence.AttributeOverrides.class javax.persistence.Basic.class javax.persistence.Cache.class javax.persistence.Cacheable.class javax.persistence.CacheRetrieveMode.class javax.persistence.CacheStoreMode.class javax.persistence.CascadeType.class javax.persistence.CollectionTable.class javax.persistence.Column.class javax.persistence.ColumnResult.class javax.persistence.criteria.AbstractQuery.class javax.persistence.criteria.CollectionJoin.class javax.persistence.criteria.CompoundSelection.class javax.persistence.criteria.CriteriaBuilder.class javax.persistence.criteria.CriteriaQuery.class javax.persistence.criteria.Expression.class javax.persistence.criteria.Fetch.class javax.persistence.criteria.FetchParent.class javax.persistence.criteria.From.class javax.persistence.criteria.Join.class javax.persistence.criteria.JoinType.class javax.persistence.criteria.ListJoin.class javax.persistence.criteria.MapJoin.class javax.persistence.criteria.Order.class javax.persistence.criteria.ParameterExpression.class javax.persistence.criteria.Path.class javax.persistence.criteria.PluralJoin.class javax.persistence.criteria.Predicate.class javax.persistence.criteria.Root.class javax.persistence.criteria.Selection.class javax.persistence.criteria.SetJoin.class javax.persistence.criteria.Subquery.class javax.persistence.DiscriminatorColumn.class javax.persistence.DiscriminatorType.class javax.persistence.DiscriminatorValue.class javax.persistence.ElementCollection.class javax.persistence.Embeddable.class javax.persistence.Embedded.class javax.persistence.EmbeddedId.class javax.persistence.Entity.class javax.persistence.EntityExistsException.class javax.persistence.EntityListeners.class javax.persistence.EntityManager.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值