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;

解决方案 »

  1.   

    测试程序:
    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);
    }
    }
      

  2.   

    不可能的吧,hibernate再怎么傻,处理不了的数据库操作也会回滚的,怎么可能会删除物理表呢!
      

  3.   

    djpsunday(创业从此开始,) :你要是不信可以把我的代码拷贝下来自己测试一下。
      

  4.   

    <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">create</property>
    自己写的,去掉。
      

  5.   

    谢谢楼上的朋友,你能帮我解释一下这个配置为什么影响了程序吗?
    我自己写的一些其他测试程序里(类似上面这个例子)也在hibernate.cfg.xml中写了这个配置,就没有问题。这是为什么呢?
      

  6.   

    你可以看看hibernate的官方文档(有中文的)
    我关注的是ddl2hbm,我习惯于先设计数据,然后生产持久类。
    我知道有工具是可以根据hbm生成ddl的(不是我关注的)
    不过从你的配置上,可以看出来,需要自动从hbm生成ddl。