blog迁移至:
http://www.micmiu.com
Hibernate不断发展,几乎成为Java数据库持久性的事实标准,因为它非常强大、灵活,而且具备了优异的性能。
传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。当然创建这些映射有很多方法,可以从已有数据库模式或Java类模型中自动创建,也可以手工创建。无论如何,您最终将获得大量的 Hibernate 映射文件,而且增加了我们的工作步骤。
而现在我们可以借助新的 Hibernate Annotation 库,即可一次性将注释直接嵌入到您的 Java 类中,不再需要映射配置的xml文件,提供了一种强大及灵活的方法来声明持久性映射。
本文主要讲解一下如果通过注释来创建复合主键以及嵌入式主键:
比如系统有用户表(UserAccount) 角色表(Role) 用户角色关系表(UserRole)三张表,用户角色关系表中 userId、roleId 组成复合主键。
一、先code 一个复合主键的类
UserRolePK:作为符合主键类,要满足以下几点要求。
1.必须实现Serializable接口。
2.必须有默认的public无参数的构造方法。
3.必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。只有对象的userId和roleId 值完全相同时或同一个对象时则返回true。否则返回false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。
具体代码如下
/**
* 用户角色表的复合主键
* @author Michael sun
*/
public class UserRolePK implements Serializable {
public UserRolePK() {
}
/**
* serialVersionUID
*/
private static final long serialVersionUID = -4901479789268752591L;
/**
* 用户名
*/
private String userId;
/**
* 角色ID
*/
private Integer roleId;
/**
* @return the userId
*/
public String getUserId() {
return userId;
}
/**
* @return the roleId
*/
public Integer getRoleId() {
return roleId;
}
/**
* @param pUserId the userId to set
*/
public void setUserId(String pUserId) {
userId = pUserId;
}
/**
* @param pRoleId the roleId to set
*/
public void setRoleId(Integer pRoleId) {
roleId = pRoleId;
}
/**
* overrides hashCode()
* @return int
*/
public int hashCode() {
int result;
result = userId.hashCode();
result = 29 * result + roleId.hashCode();
return result;
}
/**
* overrides equals
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (null == obj) {
return false;
}
if (!(obj instanceof UserRolePK)) {
return false;
}
final UserRolePK pko = (UserRolePK) obj;
if (!userId.equals(pko.userId)) {
return false;
}
if (null == roleId || roleId.intValue() != pko.roleId) {
return false;
}
return true;
}
}
二、通过
@IdClass注释在实体中标注复合主键,需要注意:
1.@IdClass标注用于标注实体所使用主键规则的类
2.在实体中同时标注主键的属性。本例中在userId和roleId的getter方法前标注@Id,表示复合主键使用这两个属性
实体代码如下。
/**
* 用户角色关系表
* @author Michael sun
*/
@Entity
@Table(name = "TB_USER_ROLE")
@IdClass(UserRolePK.class)
public class UserRole implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = -8743424029912282776L;
/**
* 用户名
*/
private String userId;
/**
* 角色ID
*/
private Integer roleId;
/**
* 创建人
*/
private String createUser;
/**
* @return the userId
*/
@Id
@Column(name = "USER_ID", nullable = false)
public String getUserId() {
return userId;
}
/**
* @return the roleId
*/
@Id
@Column(name = "ROLE_ID", nullable = false)
public Integer getRoleId() {
return roleId;
}
/**
* @param pUserId the userId to set
*/
public void setUserId(String pUserId) {
userId = pUserId;
}
/**
* @param pRoleId the roleId to set
*/
public void setRoleId(Integer pRoleId) {
roleId = pRoleId;
}
/**
* @return the createUser
*/
@Column(name = "CREATE_USER")
public String getCreateUser() {
return createUser;
}
/**
* @param pCreateUser the createUser to set
*/
public void setCreateUser(String pCreateUser) {
createUser = pCreateUser;
}
}
ps:
符合主键的值一般要通过程序设置,而不是按照某一个规则自动生成的
复合主键也可以采用嵌入式主键替代,例如上面复合主键修改成嵌入式主键的步骤如下:
一、code一个嵌入式主键的类,类似于上面的复合主键的类,需要注意
代码中加 @Column 注释的地方
具体代码如下:
/**
* 用户角色表的复合主键
* @author Michael sun
*/
public class UserRolePK implements Serializable {
/**
* UserRolePK
*/
public UserRolePK() {
super();
}
/**
* @param userId
* @param roleId
*/
public UserRolePK(String userId, Integer roleId) {
super();
this.userId = userId;
this.roleId = roleId;
}
/**
* serialVersionUID
*/
private static final long serialVersionUID = -4901479789268752591L;
/**
* 用户名
*/
private String userId;
/**
* 角色ID
*/
private Integer roleId;
/**
* @return the userId
*/
@Column(name = "USER_ID", nullable = false)
public String getUserId() {
return userId;
}
/**
* @return the roleId
*/
@Column(name = "ROLE_ID", nullable = false)
public Integer getRoleId() {
return roleId;
}
//其他和上面的复合主键一样
}
二、嵌入式主键实体类的写法
需要在复合主键类的get方法加注@EmbeddedId
具体代码如下
/**
* 用户角色关系表
* @author Michael sun
*/
@Entity
@Table(name = "TB_USER_ROLE")
public class UserRole implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = -8743424029912282776L;
/**
* 复合主键
*/
@EmbeddedId
private UserRolePK pk;
/**
* 创建人
*/
private String createUser;
/**
* @return the pk
*/
@EmbeddedId
public UserRolePK getPk() {
return pk;
}
/**
* @param pPk the pk to set
*/
public void setPk(UserRolePK pPk) {
pk = pPk;
}
/**
* @return the createUser
*/
@Column(name = "CREATE_USER")
public String getCreateUser() {
return createUser;
}
/**
* @param pCreateUser the createUser to set
*/
public void setCreateUser(String pCreateUser) {
createUser = pCreateUser;
}
/**
* @return the String
*/
@Transient
public String getUserId() {
return pk.getUserId();
}
/**
* @return the mergeFlowId
*/
@Transient
public Integer getRoleId() {
return pk.getRoleId();
}
/**
* @param pUserId the userId to set
*/
public void setUserId(String pUserId) {
this.pk.setUserId(pUserId);
}
/**
* @param pRoleId the roleId to set
*/
public void setRoleId(Integer pRoleId) {
this.pk.setRoleId(pRoleId);
}
}
分享到:
相关推荐
hibernate3 注释生成复合主键或者嵌入式主键的方法及实例
hibernate复合主键的实例,hibernate复合主键的实例。
hibernate中自动生成主键的办法
关于Hibernate的各种主键生成策略与配置详解
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
常用Hibernate主键生成策略 常用Hibernate主键生成策略 常用Hibernate主键生成策略 常用Hibernate主键生成策略
Hibernate中主键生成策略,开发的时候经常会用到的我都整理到这里了~
J2EE\Hibernate技术\Hibernate中对数据库复合主键的支持.pdf
hibernate的主键生成策略介绍,详细介绍了有关hibernate的常用主键生成策略,希望对一些正在学习hibernate的同学有一定的帮助
如果使用Hibernate开发legacy的数据库应用,对于数据库表中有使用字符串作为主键或者使用复合主键情况,那么对于这些情况的影射档是比较麻烦的。该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM...
hibernate复合主键设置,里面很全面的配置,可以拿到直接用
Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等
NULL 博文链接:https://liuna718-163-com.iteye.com/blog/748089
hibernate 无主键表映射资源说明: 1. 简单Demo 2. Demo对应的sql语句 3. 对应博客文档
Hibernate主键生成策略.doc ··········
一个简单的复合主键的做关联类的例子
更名为 Hibernate复合主键.part3.rar
1主键常用的生成策略 2对数据库的依赖性总结 3关于主键生成策略的选择 详细解释
本章讲解Hibernate中对数据库复合主键的支持