您的位置:首页 > 其它

hibernate复合主键的使用方法

2010-07-25 15:55 435 查看
在hibernate中操作存在复合主键的数据库表记录时会有一点麻烦,需要在实体类中继承Serializable,重写它的equals(Object obj)和hasCode()方法。具体实现方法如下:

以BrwInfo(读者借阅信息表)为例,复合主键是BookId,ReaderId,对应的hibernate映射文件如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="com.library.beans.BrwInfo" table="BrwInfo" schema="dbo"
catalog="Library">
<composite-id>
<key-property name="bookId" type="java.lang.String">
<column name="BookId" />
</key-property>
<key-property name="readerId" type="java.lang.String">
<column name="ReaderId" />
</key-property>
</composite-id> //此处定义复合主键BookId,ReaderId

<property name="bookName" type="java.lang.String">
<column name="BookName" not-null="true" />
</property>
<property name="readerName" type="java.lang.String">
<column name="ReaderName" not-null="true" />
</property>
<property name="brwDate" type="java.lang.String">
<column name="BrwDate" not-null="true" />
</property>
</class>
</hibernate-mapping>


与之对应的实体类,注意要重写equals(Object obj)和hasCode()方法。

/**
* 2010-6-13
* BrwInfo.java
* author:Xiangzi
* 读者借阅信息实体类
*/
package com.library.beans;

import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

public class BrwInfo implements Serializable{

private String BookId;
private String ReaderId;
private String BookName;
private String ReaderName;
private String BrwDate;

public String getBookName() {
return BookName;
}

public void setBookName(String bookName) {
BookName = bookName;
}

public String getReaderName() {
return ReaderName;
}

public void setReaderName(String readerName) {
ReaderName = readerName;
}

public String getBookId() {
return BookId;
}

public void setBookId(String bookId) {
BookId = bookId;
}

public String getReaderId() {
return ReaderId;
}

public void setReaderId(String readerId) {
ReaderId = readerId;
}

public String getBrwDate() {
return BrwDate;
}

public void setBrwDate(String brwDate) {
BrwDate = brwDate;
}

public boolean equals(Object obj) {
if (!(obj instanceof BrwInfo)) {
return false;
}

BrwInfo brw = (BrwInfo) obj;
return new EqualsBuilder().appendSuper(super.equals(obj)).append(this.BookId, brw.BookId).append(this.ReaderId, brw.ReaderId).isEquals();
}

public int hasCode() {
return new HashCodeBuilder(-528253723, -475504089).appendSuper(super.hashCode()).append(this.BookId).append(this.ReaderId).toHashCode();
}
}


下面就可以在数据层实现对这个表的GRUD操作了,示例如下。

/*
* 删除借阅信息
* @param readerId 读者id
* @param bookId 图书id
*/
public void delete(String readerId, String bookId) {
BrwInfo brwInfo=new BrwInfo();
brwInfo.setBookId(bookId);
brwInfo.setReaderId(readerId);
this.getHibernateTemplate().delete(this.getHibernateTemplate().get(BrwInfo.class,brwInfo));
}

/*
* 按readerId,bookId查询借阅信息
* @param readerId 读者id
* @param bookId 图书id
* @return BrwInfo 借阅实体
*/
public BrwInfo queryById(String readerId, String bookId) {
BrwInfo brwInfo=new BrwInfo();
brwInfo.setBookId(bookId);
brwInfo.setReaderId(readerId);
return (BrwInfo) this.getHibernateTemplate().get(BrwInfo.class,brwInfo);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: