Hibernate组件作为复合主键(五)
2016-03-07 21:20
169 查看
使用组件作为复合主键,也就是使用组件作为持久化类的标识符,则该组件类必须满足以下的要求。
1) 有无参数的构造器。
2) 必须实现java.io.Serializeble接口。
3) 建议正确地重写equals()和hashCode()方法,也就是根据组件类的关键属性来区分组件对象。
程序先定义如下Name组件类作为实体的主键类型。
下面Person类将键使用一个Name类型的主键。
创建并保存Person对象的程序如下。
执行的结果如下。
1) 有无参数的构造器。
2) 必须实现java.io.Serializeble接口。
3) 建议正确地重写equals()和hashCode()方法,也就是根据组件类的关键属性来区分组件对象。
程序先定义如下Name组件类作为实体的主键类型。
public class Name implements java.io.Serializable { // 定义first成员变量 private String first; // 定义last成员变量 private String last; // 无参数的构造器 public Name() { } // 初始化全部成员变量的构造器 public Name(String first , String last) { this.first = first; this.last = last; } // first的setter和getter方法 public void setFirst(String first) { this.first = first; } public String getFirst() { return this.first; } // last的setter和getter方法 public void setLast(String last) { this.last = last; } public String getLast() { return this.last; } // 重写equals()方法,根据first、last进行判断 public boolean equals(Object obj) { if (this == obj) { return true; } if (obj != null && obj.getClass() == Name.class) { Name target = (Name)obj; return target.getFirst().equals(getFirst()) && target.getLast().equals(getLast()); } return false; } // 重写hashCode()方法,根据first、last计算hashCode值 public int hashCode() { return getFirst().hashCode() * 31 + getLast().hashCode(); } }
下面Person类将键使用一个Name类型的主键。
@Entity @Table(name="person_inf") public class Person { // 以Name组件作为标识属性 @EmbeddedId @AttributeOverrides({ // 指定 @AttributeOverride(name="first", column = @Column(name="person_firstname")), @AttributeOverride(name="last", column = @Column(name="person_lastname")) }) private Name name; private int age; // name的setter和getter方法 public void setName(Name name) { this.name = name; } public Name getName() { return this.name; } // age的setter和getter方法 public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } }
创建并保存Person对象的程序如下。
public class PersonManager { public static void main(String[] args) { PersonManager mgr = new PersonManager(); mgr.createAndStorePerson(); HibernateUtil.sessionFactory.close(); } private void createAndStorePerson() { Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); // 创建Person对象 Person person = new Person(); // 为Person对象设置属性 person.setAge(21); // 创建一个Name对象作为Person对象的标识属性值 person.setName(new Name("owen.org" , "Hibernate")); session.save(person); tx.commit(); HibernateUtil.closeSession(); } }
执行的结果如下。
相关文章推荐
- jQuery代码优化:事件委托
- 1406 完数
- if中的-n -z linux_Shell
- HDU 2084 数塔
- 动态文字排版(GridView与ArrayAdapter)
- 最长公共子序列(非连续)
- iOS 3D Touch使用<二、 Peek、Pop使用>
- iOSDay01C语言数据类型
- ios的一些经验记录1
- linux笔记 第十六天
- Xcode 7 使用CoreData 关于数据库升级问题
- 常用的工具类
- WebView图片自适应屏幕
- ORACLE基础知识
- fatal error C1083: 无法打开预编译头文件:“Debug/XXXX.pch”: No such file or directory
- SpringMVC的工作流程
- 全排列 next_permutation
- c语言训练题:关于张三李四王五说谎的问题(此处用javascript实现)
- 三部委明确能源互联网建设10重点
- 试试水