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

本文共 1954 字,大约阅读时间需要 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进行映射.

非常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每个属性.

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
香港美食记录(物价参考)
查看>>
Oracle DG 备库恢复--gap
查看>>
iptables简介1
查看>>
AdaNet — 轻量级的 TensorFlow AutoML 框架
查看>>
斯坦福凸优化课程Video2.4_
查看>>
阿里AI设计师一秒出图,小撒连连惊呼,真相是...
查看>>
python之Unittest单元测试框架
查看>>
Spring学习笔记
查看>>
C# Lambda表达式详解,及Lambda表达式树的创建
查看>>
基于Docker搭建Jumpserver堡垒机操作实践
查看>>
vs2017开发IOS(vs2017 xamarin 连接mac)
查看>>
聊聊 scala 的模式匹配
查看>>
百度L4量产杀入乘用车后院,李彦宏首谈“车路城”终极形态
查看>>
Tornado 在模板里使用 Python 语句
查看>>
飞天2.0 | 万物智能的基础服务
查看>>
Android 拦截WebView加载URL,控制其加载CSS、JS资源
查看>>
Confluence 6 导入 SSL 证书和问题解决
查看>>
采用个hook技术对writefile函数进行拦截(2)
查看>>
马化腾可能不需要知乎,但知乎需要马化腾
查看>>
uC/OS-II源码分析(三)
查看>>