Hibernate一对一外键双向联系关系实例
Hibernate一对一外键双向关联实例
类图如下:
Person.java类
package com.org.model; public class Person { private int id; private String name; private Card card; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } }
Card.java类
package com.org.model; public class Card { private int id; private String cardNum; private Person person; public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCardNum() { return cardNum; } public void setCardNum(String cardNum) { this.cardNum = cardNum; } }
Person.hbm.xml映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.org.model"> <class name="Person" table="person"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name" not-null="true"/> <!-- name指Student类中对应一方的属性名 cascade属性指定级联操作 unique指定外键的唯一性 class指一方的类名 column表示关联的外键 not-null表示此外键不能为空 --> <many-to-one name="card" class="Card" cascade="save-update" unique="true" column="card_id" not-null="true"> </many-to-one> </class> </hibernate-mapping>
Card.hbm.xml映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.org.model"> <class name="Card" table="card"> <id name="id"> <generator class="native"/> </id> <property name="cardNum" column="card_num" not-null="true"/> <!-- property-ref用于指定关联类的一个属性,这个属性将会和外键相对应,如果没有指定,会使用对方 关联类的主键。 --> <one-to-one name="person" cascade="save-update" property-ref="card"></one-to-one> </class> </hibernate-mapping>
测试类:
package com.org.model.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.org.model.Card; import com.org.model.Person; import com.org.util.HibernateUtil; public class HibernateTest1 { @Test public void testSave1() { Session session = null; Transaction tx = null; try { // 拿到session session = HibernateUtil.getSession(); // 开启事务 tx = session.beginTransaction(); // 给实体赋值 Person person = new Person(); person.setName("aaa"); Card card = new Card(); card.setCardNum("11111111111111"); person.setCard(card); card.setPerson(person); session.save(card); //提交事务 tx.commit(); } catch (Exception e) { // 打印堆栈信息 e.printStackTrace(); // 事务回滚 if (tx != null) { tx.rollback(); } } finally { HibernateUtil.closeSession(session); } } }
结果:
Hibernate: insert into card (card_num) values (?) Hibernate: insert into person (name, card_id) values (?, ?)