关联关系映射——一对一关联

来源:互联网 发布:淘宝怎么给客服发图片 编辑:程序博客网 时间:2024/06/03 00:41

                                一对一关联

   Hibernate映射实体的一对一关联关系有两种实现方式:共享主键方式和唯一外键方式。所谓共享主键方式就是限制两个数据表的主键使用相同的值,通过主键实现一对一映射关系,即主键相同。所谓唯一外键方式就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系,多对一的特殊情况。

     第一种、共享主键方式

登录表login:


详细信息表detail:


(1)创建Java项目,命名为Hibernate_mapping1-1

(2)添加Hibernate框架

(3)生成数据库对应的Java类对象和映射文件

(4)修改代码,建立表之间的关联

Login.java

package org.vo;public class Login implements java.io.Serializable {private Integer id;private String username;private String password;private Detail detail;//添加属性字段public Detail getDetail() {return detail;}public void setDetail(Detail detail) {this.detail = detail;}public Login() {}public Login(String username, String password,Detail detail) {this.username = username;this.password = password;this.detail=detail;//完善构造函数}public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return this.username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return this.password;}public void setPassword(String password) {this.password = password;}}
Detail.java

package org.vo;public class Detail implements java.io.Serializable {private Integer id;private String truename;private String email;private Login login;public Login getLogin() {return login;}public void setLogin(Login login) {this.login = login;}public Detail() {}public Detail(String truename, String email,Login login) {this.truename = truename;this.email = email;this.login=login;}public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getTruename() {return this.truename;}public void setTruename(String truename) {this.truename = truename;}public String getEmail() {return this.email;}public void setEmail(String email) {this.email = email;}}
Login.hbm.xml

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>    <class name="org.vo.Login" table="login" schema="dbo" catalog="Test">        <id name="id" type="java.lang.Integer">            <column name="id" />            <!-- 采用foreign标识生成器,直接采用外键的属性值,达到共享主键的目的 -->            <generator class="foreign">            <param name="property">detail</param>            </generator>        </id>        <property name="username" type="java.lang.String">            <column name="username" length="50" />        </property>        <property name="password" type="java.lang.String">            <column name="password" length="50" />        </property>        <!-- name表示属性名字,class表示被关联的类的名字,constrained="true"标识当前主键上存在一个外键约束 -->        <one-to-one name="detail" class="org.vo.Detail" constrained="true"></one-to-one>    </class></hibernate-mapping>
Detail.hbm.xml

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>    <class name="org.vo.Detail" table="detail" schema="dbo" catalog="Test">        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="native" />        </id>        <property name="truename" type="java.lang.String">            <column name="truename" length="50" />        </property>        <property name="email" type="java.lang.String">            <column name="email" length="50" />        </property>        <!-- cascade="all"表示主控类的所有操作,对关联类也执行同样的操作,lazy="false"表示此关联为立即加载 -->        <one-to-one name="login" class="org.vo.Login" cascade="all" lazy="false">        </one-to-one>    </class></hibernate-mapping>
Test.java

package org.test;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.util.HibernateSessionFactory;import org.vo.Detail;import org.vo.Login;public class test {Session session=HibernateSessionFactory.getSession();public static void main(String[] args) {// TODO Auto-generated method stubtest t=new test();t.save();t.query();HibernateSessionFactory.closeSession();}public void save(){Transaction tc=session.beginTransaction();Detail detail=new Detail();Login login=new Login();login.setUsername("pengtao");login.setPassword("123456");detail.setTruename("彭涛");detail.setEmail("1234@qq.com");login.setDetail(detail);detail.setLogin(login);session.save(detail);tc.commit();}public void query(){try{Query query1=session.createQuery("from Detail");Query query2=session.createQuery("from Login");List list1=query1.list();List list2=query2.list();for(int i=0;i<list1.size();i++){Detail detail=(Detail)list1.get(i);Login login=(Login)list2.get(i);System.out.println("ID"+detail.getId()+","+"Truename"+","+detail.getTruename());System.out.println("ID"+login.getId()+","+"username"+","+login.getUsername());}}catch(Exception e){e.printStackTrace();}}}
运行结果:



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电视家看直播卡怎么办 日上提货单丢了怎么办 想直飞香港l签怎么办 u盘识别不出来怎么办 卫生间下水道有小飞虫怎么办 橙光一直闪退怎么办 若白回来了,长安怎么办 没了你以后我该怎么办 玩cf的时候闪退怎么办 婴儿嗓子哭哑了怎么办 宝宝嗓子哭哑了怎么办 小孩嗓子哭哑了怎么办 孩子嗓子哭哑了怎么办 月经来了晚上漏怎么办 在学校月经漏了怎么办 月经来了血下不来怎么办 想让月经快点来怎么办 孩子来月经不规律怎么办 一个月来2次月经怎么办 14岁月经不规律怎么办 不是经期内裤有黑色血怎么办 月经量多血块多怎么办 网友见面没上她怎么办 拔完智齿老流血怎么办 学车教练不教怎么办 想开奶茶店没有经验怎么办 宝宝吃多了不消化怎么办 吃了糖精和鸡蛋怎么办 小米平板2太卡了怎么办 小米平板2卡顿怎么办 小米4黑屏没反应怎么办 小米5c开不了机怎么办 小平板开不了机怎么办 小米4白屏了怎么办 小米5s手机白屏怎么办 16g内存不够用怎么办 小米3字库坏了怎么办 小米平板1充电慢怎么办 红米4x网速慢怎么办 小米手环进水了怎么办 玉镯取不下来了怎么办