在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));
}
相关推荐
第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并...
@Entity 注解将一个类声明为实体 Bean, @Id 注解声明了该实体Bean的标识属性。 Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。 定义表 通过 @Table 为实体...
o @Embeddable o @Embedded o @EmbeddedId o @Entity o @EntityListeners o @EntityResult o @Enumerated o @ExcludeDefaultListeners o @ExcludeSuperclassListeners • F o @FieldResult • G o @GeneratedValue ...
文件:kotlin-compiler-embeddable-1.4.10.jar下载,kotlin开发必备
kotlin-compiler-embeddable-1.3.50.jar下载后直接可用(亲测)。Could not download kotlin-compiler-embeddable.jar,是墙的原因 没有下载下来kotlin-compiler-embeddable.jar的jar包资源。 把下载好的jar,放在...
otlin-compiler-embeddable-1.6-M1 下载慢 otlin-compiler-embeddable 下载慢 直接复制到 C:\Users\xxx\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-compiler-embeddable\1.6.0-M1
kotlin-compiler-embeddable 1.6.10
Gradle download:kotlin-compiler-embeddable-1.4.30-M1.jar下载太慢或者失败解决办法
kotlin-compiler-embeddable 1.7.20
官网版:kotlin-compiler-embeddable-1.3.61
kotlin compiler
kotlin gradle build project所需要的jar包
kotlin-compiler-client-embeddable.jar
有时候网络下载不下来,这是下好的。 Android Studio3.6.3 所使用的kotlin插件1.3.72版本的zip包,在Android Studio的设置中安装本地插件即可
Embeddable Crystal Reports Designer Control Sample 水晶报表嵌入式开发,在自开发程序中嵌入水晶报表设计控件。 可以让用户在程序中自定义水晶报表模板。
kotlin compiler embeddable下载慢的解决办法
ECL(Embeddable Common-Lisp)是X3J13 Ansi规范中描述的Common-Lisp语言的解释器,具有CLOS(公共Lisp对象系统),条件,循环等,以及C语言的转换器,可以独立生成可执行文件。 ECL支持在Intel,Sparc,Alpha,...