单向一对一外键关联<hibernate-mapping package="com.example.hibernate">
<class name="IdCard" table="t_idcard">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" unique="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.example.hibernate">
<class name="Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
测试代码 Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

IdCard idCard = new IdCard();
idCard.setCardNo("78383");

Person person = new Person();
person.setName("tom");
person.setIdCard(idCard);

session.save(person);
tx.commit();
}
catch(Exception e) {
e.printStackTrace();
tx.rollback();
}
finally {
HibernateUtils.closeSession(session);
}HibernateUtils是工具类这段代码执行到tx.commit();的时候会抛出exception,错误是object references an unsaved transient instance
因为person.setIdCard(idCard);中,idCard没有持久化
但是在rollback后,数据库里还是会插入了一条person记录
id name idCard  
1 tom NULL 实在找不出是什么原因,是不是我的mysql配置问题?另外,如果我给两个person保存相同的idCard,即当前的idCard在person表已经有引用,违背了唯一性
那么程序执行到session.save(person);会抛异常,rollback会成功
这又是为什么

解决方案 »

  1.   

    其实问题就出在
    第一种情况执行完commit时才挂掉
    第二种情况执行完session.save的时候就挂了
      

  2.   

    如果你的Exception出现在commit以后,rollback就不会起作用了
    你在save person之前save一下ID Card应该就没问题了
      

  3.   

    我知道在save person之前save一下ID Card就没问题了我只是想问问发生我上面说的情况的原因
      

  4.   

    这是因为你的两个Object的关系造成的,如果只保存了Person而没有保存IDCARD这个关系就不成立了
    你可以在两个的关系上加cascade
    或者在session.save(person);之前加上
    session.save(person.getIdCard);
      

  5.   

    你可以用mysql> show engines;查看下你的mysql引擎,我怀疑可能试你的表引擎用的是MyISAM,这个引擎是不支持事务的,如果是的话,你吧引擎改为InnoDB再试试
      

  6.   

    的确mysql默认是不支持innodb的
    但我开启了innodb之后,还是出一样的错
    看来还有其他的问题
    mysql> show engines;
    +------------+---------+--------------------------------------------------------
    --------+
    | Engine     | Support | Comment
            |
    +------------+---------+--------------------------------------------------------
    --------+
    | MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance
            |
    | MEMORY     | YES     | Hash based, stored in memory, useful for temporary tabl
    es      |
    | InnoDB     | YES     | Supports transactions, row-level locking, and foreign k
    eys     |
    | BerkeleyDB | NO      | Supports transactions and page-level locking
            |
    | BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disa
    ppears) |
    | EXAMPLE    | NO      | Example storage engine
            |
    | ARCHIVE    | YES     | Archive storage engine
            |
    | CSV        | NO      | CSV storage engine
            |
    | ndbcluster | NO      | Clustered, fault-tolerant, memory-based tables
            |
    | FEDERATED  | YES     | Federated MySQL storage engine
            |
    | MRG_MYISAM | YES     | Collection of identical MyISAM tables
            |
    | ISAM       | NO      | Obsolete storage engine
            |
    +------------+---------+--------------------------------------------------------
    --------+
    12 rows in set (0.00 sec)