hibernate映射之主键双向一对一
数据模型:
stuinfo表
login表
实体对象模型
UserInfo private int uid; private String uname; private boolean usex; private Login login;
Login private int lid; private String lname; private String lpassword; private UserInfo userinfo;
xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.skyedu.bean"> <class name="UserInfo" table="userinfo"> <id name="uid" column="uid" > <generator class="native"></generator> </id> <property name="uname" column="uname" length="32"></property> <property name="usex" column="usex" ></property> <one-to-one name="login" class="Login" cascade="save-update"></one-to-one> </class> </hibernate-mapping>
附录解释:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.skyedu.bean"> <class name="Login" table="login"> <id name="lid" column="lid" > <generator class="foreign"> <param name="property">userinfo</param> </generator> </id> <property name="lname" column="lname" length="30"></property> <property name="lpassword" column="lpassword" length="30" ></property> <one-to-one name="userinfo" class="UserInfo" constrained="true" cascade="save-update" ></one-to-one> </class> </hibernate-mapping>
附录解释
测试:
@Test public void save(){ Session session= HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); try{ UserInfo userinfo = new UserInfo(); userinfo.setUname("魏丹"); userinfo.setUsex(true); Login login = new Login(); login.setLname("weidan"); login.setLpassword("weidan"); login.setUserinfo(userinfo);//这个顺序不能反,应为userinfo需要先保存 session.save(login); transaction.commit(); }catch(Exception e){ transaction.rollback(); }finally{ session.close(); } } @Test public void find(){ Session session= HibernateUtil.getSession(); UserInfo userinfo = (UserInfo) session.get(UserInfo.class,6); System.out.println("loginName:"+userinfo.getLogin().getLname()); System.out.println("userName:"+userinfo.getUname()); } // public static void main(String[] args) { // HibernateUtil.createTable(); // }
总结:
单向主键共享和双向主键共享比较
在依赖主键的一方是一样的配置,但是在另一方要加上one-to-one的配置