JPA的Embeddable注解

摘要:
}publicvoisetLastName(StringlastName){this.lastName=lastName;column=@column(name=“first_name”)),column=@column(name=“last_name”)})publicNamegetName(){returnname;

来源于http://zjsword2000.blog.163.com/blog/static/4583983320083184844734/

在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的每一个属性.

免责声明:文章转载自《JPA的Embeddable注解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLSERVER 标识列JMS是一种应用于异步消息传递的标准API下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Disruptor 详解

想了解一个项目,最好的办法就是,把它的源码搞到本地自己捣鼓。   在网上看了 N 多人对 Disruptor 速度的吹捧,M 多人对它的机制分析,就连 Disruptor 官方文档中,也 NB 哄哄自诩: At LMAX we have built an order matching engine, real-time risk management, a...

springboot 扫描不到包 @SpringBootApplication 自动配置原理

解决方案### 在main类中增加注解 @ComponentScan("com.test.test.*") 扫描具体的包 @ComponentScan(basePackages = {"com.test.test"}) 扫描父类之后的包 SpringBoot的启动类最好是放在root package下 原因### @SpringBootAppli...

ADODB——RecordSet对象

转自网友,看着挺全就转了,供大家学习研究。 Recordset 对象的属性1、CursorType 属性 AdOpenForwardOnly: 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。(顾名思义,这种游标只能向前移动。然而,由于这种游标功能有限,将它用于系统资源时是非常有效的。) Ad...

MySQL 复制表结构

介绍  有时候我们需要原封不动的复制一张表的表结构来生成一张新表,MYSQL提供了两种便捷的方法。 例: CREATE TABLE tb_base( id INT NOT NULL PRIMARY KEY, name VARCHAR(10), KEY ix_name (name)) ENGINE='MyISAM',CHARSET=utf8,COMMENT...

Delphi之TComponent类

TComponent类 TComponent类直接由TPersistent派生。TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件。非可视组件也是从TComponent派生的,因此它们也继承了在设计期间可以被控制的能力。TComponent派生的非可视对象的典型例子是TTimer组件。TTim...

win8中如何禁用屏幕旋转的快捷键

程序员通常会使用ctrl+alt+方向键 里编辑代码,特别对于使用eclipse的程序员,更是如此,但是win8却把这一快捷键给占用了,很不爽,如何办,很简单.直接上图: 2.但是发现禁用之后并没有解决问题,该系列快捷键还是不能被VS或eclipses使用,因此必须更改这些快捷键,才可以达到目的.在桌面空白处右击,选择:->图形属性->选项和...