Hibernate 一对一的关系
1、 新建数据库表如下:
CREATE TABLE author (
id int(11) NOT NULL auto_increment,
name varchar(50) default NULL,
PRIMARY KEY (id)
);
CREATE TABLE topic (
id int(11) NOT NULL auto_increment,
name varchar(50) default NULL,
user_id int(11) default NULL,
PRIMARY KEY (id)
);
2、 Topic.hbm.xml文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.Topic">
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<many-to-one name="author" class="model.Author" column="user_id" unique="true"/>
</class>
</hibernate-mapping>
3、 Author.hbm.xml文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.Author" table="author">
<id column="id" length="11" name="id" type="integer">
<generator class="native"/>
</id>
<property column="name" length="50" name="name" type="string"/>
</class>
</hibernate-mapping>
4、 Author.java
package model;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/** @author Hibernate CodeGenerator */
public class Author implements Serializable {
/** identifier field */
private int id;
/** nullable persistent field */
private String name;
/** full constructor */
public Author(java.lang.String name) {
this.name = name;
}
/** default constructor */
public Author() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public java.lang.String getName() {
return this.name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public String toString() {
return new ToStringBuilder(this)
.append("id", getId())
.toString();
}
public boolean equals(Object other) {
if ( !(other instanceof Author) ) return false;
Author castOther = (Author) other;
return new EqualsBuilder()
.append(this.getId(), castOther.getId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(getId())
.toHashCode();
}
}
5、 Topic.java
package model;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/** @author Hibernate CodeGenerator */
public class Topic implements Serializable {
/** identifier field */
private int id;
/** nullable persistent field */
private String name;
/** nullable persistent field */
//private int user_id;
private Author author;
/** full constructor */
public Topic(java.lang.String name, Author author) {
this.name = name;
this.author = author;
}
/** default constructor */
public Topic() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public java.lang.String getName() {
return this.name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public String toString() {
return new ToStringBuilder(this)
.append("id", getId())
.toString();
}
public boolean equals(Object other) {
if ( !(other instanceof Topic) ) return false;
Topic castOther = (Topic) other;
return new EqualsBuilder()
.append(this.getId(), castOther.getId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(getId())
.toHashCode();
}
}
测试
package test;
import java.io.File;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import model.Author;
import model.Topic;
import org.apache.log4j.PropertyConfigurator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
/**
* @author hjack 更改所生成类型注释的模板为 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class Test {
public static void main(String[] args) {
PropertyConfigurator
.configure("C:\\Downloads\\Code for Hibernate\\code\\chapter02\\log4j.Properties");
System.out.println("test is begin...");
Test app = new Test();
try {
MysqlDataSource ds = new MysqlDataSource();
ds.setURL("jdbc:mysql://localhost:3306/hibernate");
ds.setUser("root");
ds.setPassword("123456");
Hashtable table = new Hashtable();
table.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
try {
InitialContext ctx = new InitialContext(table);
ctx.bind("Hibernate", ds);
} catch (NamingException e1) {
e1.printStackTrace();
}
PropertyConfigurator
.configure("C:\\Downloads\\Code for Hibernate\\code\\chapter02\\log4j.Properties");
Configuration cfg = new Configuration();
File fs = new File(
"C:\\Downloads\\Code for Hibernate\\code\\chapter02\\hibernate.cfg.xml");
cfg.configure(fs);
SessionFactory sf = cfg.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
System.out.println("测试插入作者...");
Author author = new Author();
author.setName("jack");
sess.save(author);
System.out.println("测试插入作者成功...");
Topic topic = new Topic();
topic.setName("helloworld.");
topic.setAuthor(author);
// 因为只是插入一个话题,并不必在author表中插入一条记录,所以只需save(topic)
sess.save(topic);
Topic topicnew = (Topic) sess.load(Topic.class, new Integer(4));
System.out.println(topicnew.getAuthor().getName());
sess.flush();
tx.commit();
sess.close();
} catch (HibernateException e) {
System.out.println(e.toString());
} finally {
}
}
}