单向一对一外键关联<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会成功
这又是为什么
<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会成功
这又是为什么
第一种情况执行完commit时才挂掉
第二种情况执行完session.save的时候就挂了
你在save person之前save一下ID Card应该就没问题了
你可以在两个的关系上加cascade
或者在session.save(person);之前加上
session.save(person.getIdCard);
但我开启了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)