`

Hibernate DAO实体类 引用实体时@Embeddable注解

阅读更多

在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;

 }

  @Index(name = "first_name_index")

  @Column(name = "first_name",length = 128)

 public String getFirstName() {

  return firstName;

 }

 public void setFirstName(String firstName) {

  this.firstName = firstName;

 }

 

@Index(name = "last_name_index")

  @Column(name = "last_name",length = 128)

 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

@ID--如果作为联合主键

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

 

或者

public List<Person> getByItemId(String firstName) {

    return super.findByCriteria(Restrictions.eq("name.firstName", firstName));

  }

分享到:
评论

相关推荐

    hibernate注解详解

    `@Entity` 注解用于标记一个Java类为Hibernate的实体类,它对应数据库中的一个表。例如: ```java @Entity public class User { // ... } ``` 这表示User类将映射到数据库中的一个表。 2. **表名注解(@...

    Hibernate 注解说明文档

    2. **@OneToMany**: 一对多关联,可以指定`mappedBy`属性,表明在另一方实体类中有引用。 3. **@ManyToOne**: 多对一关联,通常与`@JoinColumn`配合使用,指定外键列。 4. **@ManyToMany**: 多对多关联,通常通过...

    hibernate复合主键设置

    `@Embeddable`用于定义一个复合主键类,而`@EmbeddedId`则是在实体类中声明这个复合主键。 1. 定义复合主键类 首先,创建一个表示复合主键的类,通常会包含所有主键字段,并使用`@Embeddable`注解: ```java ...

    hibernate注解学习笔记

    `@Embeddable` 注解用于标识一个类可以被嵌入到另一个实体类中。这种情况下,不会为这个类创建单独的表,而是将其属性直接映射到包含它的实体类所在的表中。 例如: ```java @Embeddable public class Address { ...

    hibernate注解详解说明

    2. Hibernate 库:添加 Hibernate 相关的 JAR 文件到项目的类路径中,包括核心库和注解处理库。 3. 数据库驱动:根据所使用的数据库,添加相应的 JDBC 驱动 JAR 文件。 系统配置主要包括: 1. 为 Hibernate 配置...

    hibernate复合主键映射

    这里,`@Embeddable`注解告诉Hibernate这是一个可以嵌入到其他实体中的类,它将作为复合主键的一部分。 然后,在包含复合主键的实体类中,我们需要使用`@EmbeddedId`注解: ```java import javax.persistence....

    Hibernate注解映射联合主键

    在Java的持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据模型设计,用于处理具有多个字段作为主键的实体。联合主键通常在数据表中的某些列共同决定了唯一标识的情况出现。在Hibernate中,有三种...

    hibernate

    在Hibernate中,可以使用`@Embeddable`注解来标记一个类作为复合组件,然后在包含它的实体类中使用`@Embedded`注解进行引用。复合组件的一个典型例子是地址信息,可以将其封装成一个独立的类,然后在用户实体类中...

    hibernate属性级别注解实例代码

    Hibernate属性级别注解是Hibernate ORM框架中用于在Java对象(实体类)的属性上定义数据库映射的关键元素。这些注解使得开发人员能够无需XML配置文件就能声明对象与数据库之间的映射关系,从而简化了开发过程。以下...

    hibernate的注解形式

    1. **实体类注解**:在Hibernate中,一个Java类可以被标记为数据库中的一个表,这通常使用`@Entity`注解完成。例如: ```java @Entity public class User { // ... } ``` 2. **表名注解**:如果实体类名称与表名不...

    hibernate-annotations-3.4.0.GA

    `@EmbeddedId`和`@Embeddable`注解组合可以创建复合主键,将多个字段封装到一个类中,然后在主键类上使用`@Embeddable`,在实体类上使用`@EmbeddedId`。 6. **缓存机制** Hibernate提供了一级缓存(Session级别的...

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

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

    hibernate 无主键表映射

    `@Embeddable`注解用于定义一个包含复合主键字段的类,而`@EmbeddedId`注解则用在实体类上,指定这个复合主键类。 以下是一个简单的示例: 1. **复合主键类(Composite Key Class)** ```java import javax....

    Hibernate一对一单向外键关联 (联合主键annotation)

    `@EmbeddedId`注解用于声明一个类作为主键,而`@Embeddable`注解用于定义主键类。联合主键意味着多个字段共同构成主键,这样可以提供更为复杂和灵活的主键策略。 以下是一个示例,假设我们有两个实体,一个是`...

    Hibernate联合主键的例子

    在Hibernate中,我们可以使用`@Embeddable`和`@EmbeddedId`注解来定义和使用联合主键。 1. **创建联合主键类:** 在MyEclipse中,我们首先创建一个Java类来表示联合主键。这个类需要被标记为`@Embeddable`,并包含...

    hibernate_annotations(中文API,高清)

    例如,@Inheritance注解用于指定实体类的继承策略,@Embedded和@Embeddable注解用于实现组件映射。 6. **注解与XML的混合使用**:尽管Hibernate Annotations鼓励使用注解来简化映射配置,但开发者仍然可以在项目中...

    Hibernate_关联关系映射配置

    配置时需要指定关联的实体类和引用的字段,同样可以设置`fetch`和`cascade`策略。 四、多对多(Many-to-Many) 多对多关联是两个实体之间最复杂的关联类型,例如用户可以加入多个群组,群组也可以包含多个用户。在...

    hibernate复合主键配置和使用

    首先,我们需要创建一个表示复合主键的类,该类需要被`@Embeddable`注解标记。例如,假设我们有用户地址表,其中主键由用户ID和地址ID组成: ```java @Embeddable public class AddressId implements Serializable ...

    hibernate组件之间的关联

    使用 @Component 或 @Embeddable 注解来标记可嵌入的组件类,然后在父类中使用 @Embedded 或 @EmbeddableId 来引用它们。 **联合主键(Composite Key)** 在某些场景下,可能需要多个字段共同构成主键。使用 @...

Global site tag (gtag.js) - Google Analytics