来源于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注解详解 JPA(Java Persistence API)是Java企业版5(Java EE 5)的一部分,提供了一个对象关系映射方法,使得开发者可以使用声明方式定义如何将Java对象映射到关系数据库表。在JPA中,批注是一种使用元数据...
本文将详细介绍 JPA 中的主要批注(注解),帮助开发者更好地理解和使用 JPA。 #### 实体(Entity) - **`@Entity`**:此注解用于标记 Java 类为 JPA 实体。被标注的类将成为持久化层的一部分,其实例将被存储到...
### JPA注解参考知识点详解 #### 一、引言 Java Persistence API(简称JPA)作为Java企业版5(Java EE 5)标准的一部分,是Enterprise JavaBeans(EJB)3.0规范的重要组成部分。它极大地简化了EJB持久化,并提供了...
**Toplink JPA注解参考** Toplink JPA(Java Persistence API)是Oracle公司提供的一种对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。JPA提供了丰富的注解,使得在Java...
在JPA中,注解(也称为标签)起着至关重要的作用,它们提供了声明式的方式来配置实体类,使得这些类能够被持久化到数据库中。 1. **实体**: - `@Entity`:这个注解标记一个Java类为一个JPA实体,意味着这个类的...
### JPA注解详解 #### 一、概述 Java Persistence API (JPA) 是 Java 社区标准 JSR-317 的一部分,它提供了一种面向对象的方式来处理数据库操作,极大地方便了 Java 应用程序对关系数据库的操作。JPA 主要包括两个...
**JPA注解详解(一)** Java Persistence API(JPA)是Java平台上的一个标准,用于管理和持久化对象到数据库。它简化了在Java应用中处理关系数据库的过程,通过提供一套注解来声明对象与数据库表之间的映射。本篇...
在使用TopLink JPA时,您可以使用注解配置JPA实体的行为。注解是一种简单、表达性强的在Java源代码上添加元数据的方法,这些元数据在编译时会被嵌入到对应的Java类文件中,由TopLink JPA在运行时解释以管理JPA行为。...
嵌入映射涉及到将多个实体字段嵌入到一个单独的表中,使用@Embedded和@Embeddable注解实现。这在多个实体共享一些公共属性时非常有用,如地址信息可以嵌入到多个实体中。 派生标识映射是通过主控关系的外键来派生...
联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个复合主键,适用于那些不满足单一主键条件的表。 以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象关系映射、查询语言、...
在 JPA 中,使用 `@OneToOne` 注解来定义这种关系,并通过 `@JoinColumn` 注解指定关联字段。 **示例代码:** ```java @OneToOne @JoinColumn(name = "USER_ID") private UserEmail userEmail; ``` 在这个例子中...
在JPA中,可以通过实现`javax.persistence.Embeddable`接口来定义复合主键类,并在实体类中使用`@EmbeddedId`注解来指定。 2. **JPAtest**:这可能是用于进行JPA基本操作的测试项目,如CRUD(创建、读取、更新、...
### JPA注解详解 #### 一、JPA概述 Java Persistence API (JPA) 是 Java 企业版 5 (Java EE 5) 的一部分,它显著简化了 Enterprise Java Beans (EJB) 的持久化机制,并引入了一种声明式的对象关系映射 (ORM) 方法...
### Java Persistence API (JPA) 与 EJB 3.0 实体 Bean 注解详解 #### 一、JPA 概述与实体 Bean 的转变 Java Persistence API (JPA) 是 Java 社区规范 JSR-220 的一部分,旨在提供一种标准的方式来处理对象与关系...
`@Id`注解标记主键字段,如果需要复合主键,可以使用`@EmbeddedId`和`@Embeddable`。 4. **Repository(仓库)**:Spring JPA通过Repository接口提供了一种声明式的数据访问方式。你可以自定义Repository接口,添加...
在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass注解**:当你需要创建一个单独的类来表示联合主键时,可以使用@IdClass。例如,假设我们有一个`Student`实体和一个`Course`实体...
对于需要多个字段共同作为主键的情况,JPA提供了@Embeddable和@EmbeddedId注解来定义复合主键类。 3. 链接查询(Association Queries) JPA允许在查询中直接引用实体的关联属性,简化了关联数据的获取。 4. 自定义...
**JPA注解详解** Java持久化API (JPA) 是Java企业版5 (Java EE 5) 的一部分,旨在简化Enterprise Java Bean (EJB) 3.0规范中的持久化处理,提供了一种对象关系映射(ORM)机制。JPA允许开发者以声明式方式定义Java...
### JPA注解详解 #### 一、概述 Java Persistence API (JPA) 是 Java EE 5 Enterprise JavaBeans (EJB) 3.0 规范的一部分,它极大地简化了 EJB 的持久化机制,并引入了一种声明式的对象关系映射方法。这种映射方法...