博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA的Embeddable注解
阅读量:5900 次
发布时间:2019-06-19

本文共 1922 字,大约阅读时间需要 6 分钟。

来源于

 

 

 

 

在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.需要有无参的构造函数

注释,表示此类可以被插入某个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的每一个属性.

转载地址:http://gyesx.baihongyu.com/

你可能感兴趣的文章
七牛云之上传demo
查看>>
SELinux引起的SSH公钥认证失败问题
查看>>
分布式主键生成策略
查看>>
神兵利器——Alfred
查看>>
wireshark使用
查看>>
Android定位&地图&导航——基于百度地图实现的定位功能
查看>>
条件极值(1):隐函数极值问题
查看>>
陶哲轩实分析定理11.9.1:微积分第一基本定理(一)
查看>>
HTML一些标记
查看>>
ruby 爬虫爬取拉钩网职位信息,产生词云报告
查看>>
如何使Ubuntu在vm里面全屏
查看>>
微软职位内部推荐-Principal Software Eng Mgr
查看>>
.net技术博客地址列表
查看>>
字符串处理 Codeforces Round #305 (Div. 2) A. Mike and Fax
查看>>
python学习——函数及其参数
查看>>
《CLR Via C# 第3版》笔记之(五) - C#中的伪Union类型
查看>>
国王游戏
查看>>
为什么我厌恶扫楼
查看>>
HTTP请求中POST与GET的区别
查看>>
java集合框架03
查看>>