`
hekui1016
  • 浏览: 51095 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JPA的Embeddable注解

 
阅读更多

来源于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的每一个属性.

分享到:
评论
3 楼 就是我啊 2013-08-14  
sorry,点错了..
2 楼 就是我啊 2013-08-14  
[flash=200,200][img][list]
[*]
引用
[i][u][i][u][u][i][u][i][b][b][b][i][u][u][u][u][i][b]
[*][flash=200,200][url][img][list]
[*][*]
引用
  • [/list][/img][/url][/flash]
    [*]
    [/b][/i][/u][/u][/u][/u][/i][/b][/b][/b][/i][/u][/i][/u][/u][/i][/u][/i]
    ||||[/list][/img][/flash]||
    |
    |
    1 楼 tc_xiao 2013-04-18  
    厉害,

    相关推荐

      jpa注解详解

      JPA注解详解 JPA(Java Persistence API)是Java企业版5(Java EE 5)的一部分,提供了一个对象关系映射方法,使得开发者可以使用声明方式定义如何将Java对象映射到关系数据库表。在JPA中,批注是一种使用元数据...

      JPA批注参考(主要介绍JPA中的相关注解)

      本文将详细介绍 JPA 中的主要批注(注解),帮助开发者更好地理解和使用 JPA。 #### 实体(Entity) - **`@Entity`**:此注解用于标记 Java 类为 JPA 实体。被标注的类将成为持久化层的一部分,其实例将被存储到...

      JPA注解参考文档.txt

      ### JPA注解参考知识点详解 #### 一、引言 Java Persistence API(简称JPA)作为Java企业版5(Java EE 5)标准的一部分,是Enterprise JavaBeans(EJB)3.0规范的重要组成部分。它极大地简化了EJB持久化,并提供了...

      Toplink_JPA注解参考

      **Toplink JPA注解参考** Toplink JPA(Java Persistence API)是Oracle公司提供的一种对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。JPA提供了丰富的注解,使得在Java...

      JPA标签(注解)详细说明

      在JPA中,注解(也称为标签)起着至关重要的作用,它们提供了声明式的方式来配置实体类,使得这些类能够被持久化到数据库中。 1. **实体**: - `@Entity`:这个注解标记一个Java类为一个JPA实体,意味着这个类的...

      JPA注解帮助文档

      ### JPA注解详解 #### 一、概述 Java Persistence API (JPA) 是 Java 社区标准 JSR-317 的一部分,它提供了一种面向对象的方式来处理数据库操作,极大地方便了 Java 应用程序对关系数据库的操作。JPA 主要包括两个...

      JPA 注解(一)

      **JPA注解详解(一)** Java Persistence API(JPA)是Java平台上的一个标准,用于管理和持久化对象到数据库。它简化了在Java应用中处理关系数据库的过程,通过提供一套注解来声明对象与数据库表之间的映射。本篇...

      JPA 标注 JPA标签手册

      在使用TopLink JPA时,您可以使用注解配置JPA实体的行为。注解是一种简单、表达性强的在Java源代码上添加元数据的方法,这些元数据在编译时会被嵌入到对应的Java类文件中,由TopLink JPA在运行时解释以管理JPA行为。...

      JPA2映射的神秘之旅

      嵌入映射涉及到将多个实体字段嵌入到一个单独的表中,使用@Embedded和@Embeddable注解实现。这在多个实体共享一些公共属性时非常有用,如地址信息可以嵌入到多个实体中。 派生标识映射是通过主控关系的外键来派生...

      传智播客JPA学习笔记.pdf

      联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个复合主键,适用于那些不满足单一主键条件的表。 以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象关系映射、查询语言、...

      JPA映射关系详解javax JPA JPA映射关系 JPA映射

      在 JPA 中,使用 `@OneToOne` 注解来定义这种关系,并通过 `@JoinColumn` 注解指定关联字段。 **示例代码:** ```java @OneToOne @JoinColumn(name = "USER_ID") private UserEmail userEmail; ``` 在这个例子中...

      JPA 黎活明JPA视频代码

      在JPA中,可以通过实现`javax.persistence.Embeddable`接口来定义复合主键类,并在实体类中使用`@EmbeddedId`注解来指定。 2. **JPAtest**:这可能是用于进行JPA基本操作的测试项目,如CRUD(创建、读取、更新、...

      JPA 批注参考.pdf

      ### JPA注解详解 #### 一、JPA概述 Java Persistence API (JPA) 是 Java 企业版 5 (Java EE 5) 的一部分,它显著简化了 Enterprise Java Beans (EJB) 的持久化机制,并引入了一种声明式的对象关系映射 (ORM) 方法...

      JPA 批注参考 EJB3.0实体Bean注解详细解析

      ### Java Persistence API (JPA) 与 EJB 3.0 实体 Bean 注解详解 #### 一、JPA 概述与实体 Bean 的转变 Java Persistence API (JPA) 是 Java 社区规范 JSR-220 的一部分,旨在提供一种标准的方式来处理对象与关系...

      spring jpa

      `@Id`注解标记主键字段,如果需要复合主键,可以使用`@EmbeddedId`和`@Embeddable`。 4. **Repository(仓库)**:Spring JPA通过Repository接口提供了一种声明式的数据访问方式。你可以自定义Repository接口,添加...

      15_传智播客JPA详解_JPA中的联合主键

      在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass注解**:当你需要创建一个单独的类来表示联合主键时,可以使用@IdClass。例如,假设我们有一个`Student`实体和一个`Course`实体...

      EJB3_JPA文档

      对于需要多个字段共同作为主键的情况,JPA提供了@Embeddable和@EmbeddedId注解来定义复合主键类。 3. 链接查询(Association Queries) JPA允许在查询中直接引用实体的关联属性,简化了关联数据的获取。 4. 自定义...

      JAP注解参考

      **JPA注解详解** Java持久化API (JPA) 是Java企业版5 (Java EE 5) 的一部分,旨在简化Enterprise Java Bean (EJB) 3.0规范中的持久化处理,提供了一种对象关系映射(ORM)机制。JPA允许开发者以声明式方式定义Java...

      JPA帮助文档

      ### JPA注解详解 #### 一、概述 Java Persistence API (JPA) 是 Java EE 5 Enterprise JavaBeans (EJB) 3.0 规范的一部分,它极大地简化了 EJB 的持久化机制,并引入了一种声明式的对象关系映射方法。这种映射方法...

    Global site tag (gtag.js) - Google Analytics