Passport类:
package com.bryantd.hibernate.entity;import java.io.Serializable;public class Passport implements Serializable {
private Integer id;
private int serialNumber;
private int expiryTime;
private User user;
public Passport(int serialNumber, int expiryTime) {
super();
// TODO Auto-generated constructor stub
this.serialNumber = serialNumber;
this.expiryTime = expiryTime;
}
public Passport(){}
public int getExpiryTime() {
return expiryTime;
}
public void setExpiryTime(int expiryTime) {
this.expiryTime = expiryTime;
} public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
} public int getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(int serialNumber) {
this.serialNumber = serialNumber;
} public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}}Passport的映射文件passport.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="com.bryantd.hibernate.entity.Passport"
table="undirectional_foreignkey_one_to_one_passport">
<id name="id" type="java.lang.Integer">
<column name="id" sql-type="INTEGER"/>
<generator class="native"/>
</id>
<property name="serialNumber" type="int">
<column name="serialNumber" sql-type="INTEGER"/>
</property>
<property name="expiryTime" type="int">
<column name="expiryTime" sql-type="INTEGER"/>
</property>
<!--
If you use "one-to-one" element, it indicates that the "id" column is the relative column
"property-ref" attribute is the name of associated class's preporty which is used to be associated with the domain class -->
<one-to-one
name="user"
class="com.bryantd.hibernate.entity.User"
property-ref="passport"/>
</class></hibernate-mapping>两个表的数据库文件:
/*
SQLyog v4.07
Host - 4.1.20-community-nt : Database - hibernatestudy
*********************************************************************
Server version : 4.1.20-community-nt
*/
create database if not exists `hibernatestudy`;USE `hibernatestudy`;/*Table structure for table `undirectional_foreignkey_one_to_one_passport` */drop table if exists `undirectional_foreignkey_one_to_one_passport`;CREATE TABLE `undirectional_foreignkey_one_to_one_passport` (
`id` int(11) NOT NULL auto_increment,
`serialNumber` int(11) default NULL,
`expiryTime` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*Table structure for table `undirectional_foreignkey_one_to_one_user` */drop table if exists `undirectional_foreignkey_one_to_one_user`;CREATE TABLE `undirectional_foreignkey_one_to_one_user` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`age` int(3) default NULL,
`passport_id` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
package com.bryantd.hibernate.entity;import java.io.Serializable;public class Passport implements Serializable {
private Integer id;
private int serialNumber;
private int expiryTime;
private User user;
public Passport(int serialNumber, int expiryTime) {
super();
// TODO Auto-generated constructor stub
this.serialNumber = serialNumber;
this.expiryTime = expiryTime;
}
public Passport(){}
public int getExpiryTime() {
return expiryTime;
}
public void setExpiryTime(int expiryTime) {
this.expiryTime = expiryTime;
} public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
} public int getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(int serialNumber) {
this.serialNumber = serialNumber;
} public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}}Passport的映射文件passport.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="com.bryantd.hibernate.entity.Passport"
table="undirectional_foreignkey_one_to_one_passport">
<id name="id" type="java.lang.Integer">
<column name="id" sql-type="INTEGER"/>
<generator class="native"/>
</id>
<property name="serialNumber" type="int">
<column name="serialNumber" sql-type="INTEGER"/>
</property>
<property name="expiryTime" type="int">
<column name="expiryTime" sql-type="INTEGER"/>
</property>
<!--
If you use "one-to-one" element, it indicates that the "id" column is the relative column
"property-ref" attribute is the name of associated class's preporty which is used to be associated with the domain class -->
<one-to-one
name="user"
class="com.bryantd.hibernate.entity.User"
property-ref="passport"/>
</class></hibernate-mapping>两个表的数据库文件:
/*
SQLyog v4.07
Host - 4.1.20-community-nt : Database - hibernatestudy
*********************************************************************
Server version : 4.1.20-community-nt
*/
create database if not exists `hibernatestudy`;USE `hibernatestudy`;/*Table structure for table `undirectional_foreignkey_one_to_one_passport` */drop table if exists `undirectional_foreignkey_one_to_one_passport`;CREATE TABLE `undirectional_foreignkey_one_to_one_passport` (
`id` int(11) NOT NULL auto_increment,
`serialNumber` int(11) default NULL,
`expiryTime` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*Table structure for table `undirectional_foreignkey_one_to_one_user` */drop table if exists `undirectional_foreignkey_one_to_one_user`;CREATE TABLE `undirectional_foreignkey_one_to_one_user` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`age` int(3) default NULL,
`passport_id` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
package com.bryantd.hibernate.test;import com.bryantd.hibernate.entity.User;
import com.bryantd.hibernate.entity.Passport;import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Query;
import org.hibernate.Transaction;import java.util.*;public class UndirectionalForeignKeyOneToOneTest {
public static void saveObject(Session session, Object savedObject) {
Transaction transaction = session.beginTransaction();
session.save(savedObject);
transaction.commit();
}
public static void deleteObjects(Session session, String deletedObjectName) {
Transaction transaction = session.beginTransaction();
String hql = "delete " + deletedObjectName;
Query query = session.createQuery(hql);
query.executeUpdate();
transaction.commit();
}
public static void showUsers(Session session) {
Transaction transaction = session.beginTransaction();
String hql = "from User";
Query query = session.createQuery(hql);
List list = query.list();
Iterator it = list.listIterator();
while (it.hasNext()) {
User user = (User)it.next();
System.out.println(user.getName());
Passport passport = user.getPassport();
System.out.println(passport.getSerialNumber());
}
transaction.commit();
}
public static void showPassports(Session session) {
Transaction transaction = session.beginTransaction();
String hql = "from Passport";
Query query = session.createQuery(hql);
List list = query.list();
Iterator it = list.listIterator();
while (it.hasNext()) {
Passport passport = (Passport)it.next();
System.out.println(passport.getSerialNumber());
User user = passport.getUser();
System.out.println(user.getName());
}
transaction.commit();
}
public static void main(String[] args) {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
User user = new User("Bryantd", 23);
Passport passport = new Passport(10001, 20060930);
user.setPassport(passport);
passport.setUser(user);
deleteObjects(session, "User");
//deleteObjects(session, "Passport");
saveObject(session, user);
//saveObject(session, passport);
System.out.println("Show Users:");
showUsers(session);
System.out.println("Show Passports:");
showPassports(session);
}
}
<property name="hbm2ddl.auto">create</property>
自己写的,去掉。
我自己写的一些其他测试程序里(类似上面这个例子)也在hibernate.cfg.xml中写了这个配置,就没有问题。这是为什么呢?
我关注的是ddl2hbm,我习惯于先设计数据,然后生产持久类。
我知道有工具是可以根据hbm生成ddl的(不是我关注的)
不过从你的配置上,可以看出来,需要自动从hbm生成ddl。