打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JPA的Embeddable Objects - LalfaShi‘Blog

JPA的Embeddable Objects

[ 2006-11-14 18:27:56 | 作者: LALFASHI ]
字体大小: | |
在hibernate中实现自定义类型,只要实现UserType接口即可或者以Compnent的形式提供.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类大概是什么样呢?如下:

package com.denny_blue.ejb3.entity;

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的每一个属性.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java中的实参与形参
AutoMapper简明教程(学习笔记)
ibatis 开始之旅
C#泛型之List操作示例
Java集合和数组的排序方式总结 – 码农网
[Spring MVC]
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服