Hibernate组件作为Map索引(四)
2016-03-07 21:17
363 查看
由于Map集合的特殊性,它允许使用复合类型的对象作为Map的key,所以Hibernate也对这种组件作为Map Key的情形是提供支持的。建议使用@MapKeyClass注解指定Map key的类型。如下是一个Person类中包含一个Map类型的集合属性。
下面是Name类源代码,不过这里重写了Name的equals()和hashCodde()两个方法,重写这两个方法的关键是first和last两个成员变量。
运行结果:
@Entity @Table(name="person_inf") public class Person { // 标识属性 @Id @Column(name="person_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private int age; // 集合属性nickPower @ElementCollection(targetClass=Integer.class) @CollectionTable(name="nick_power_inf", joinColumns =@JoinColumn(name="person_id" , nullable=false)) @Column(name="nick_power" , nullable=false) // 指定Map key的类型 @MapKeyClass(Name.class) private Map<Name , Integer> nickPower = new HashMap<Name , Integer>(); // id的setter和getter方法 public void setId(Integer id) { this.id = id; } public Integer getId() { return this.id; } // age的setter和getter方法 public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } // nickPower的setter和getter方法 public void setNickPower(Map<Name , Integer> nickPower) { this.nickPower = nickPower; } public Map<Name , Integer> getNickPower() { return this.nickPower; } }
下面是Name类源代码,不过这里重写了Name的equals()和hashCodde()两个方法,重写这两个方法的关键是first和last两个成员变量。
@Embeddable public class Name { // 定义first成员变量 @Column(name="person_firstname") private String first; // 定义last成员变量 @Column(name="person_lastname") private String last; // 引用拥有该Name的Person对象 @Parent private Person owner; // 无参数的构造器 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; } // owner的setter和getter方法 public void setOwner(Person owner) { this.owner = owner; } public Person getOwner() { return this.owner; } // 重写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(); } }
运行结果:
相关文章推荐
- 3.6 java基础总结①包装类,基本数据类型,String相互间转换
- 克隆虚拟机
- linux笔记 第十五天 系统安装详解、DHCP、配置PXE服务器
- HDU-1253-胜利大逃亡
- [图论]用Edmonds-Karp算法求解最大流问题(C语言实现)
- 求第n个斐波纳契数是否是素数
- HDU5638 bestcoder#74 Toposort 题解&代码
- POJ 3070 Fibonacci(矩阵快速幂)
- MSSQL 构建临时表SQL
- MSSQL DBOtherSQL
- Chapter 7、面向对象(三)--- 静态、方法重载、继承
- 【PAT】1046. 划拳(15)
- Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?
- 局部刷新ListView,实现点赞功能
- Androidstudio学习初步问题
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- JavaScript学习总结-技巧、有用函数、简洁方法、编程细节
- linux下的mount命令的用法详解
- Java日期
- 怎样了解一个行业