上次我们说了hibernate关联映射中的一对一关联,我们是通过两个表的主键来进行关联。这次我们看一下通过外键来进行关联的一对一关联。
还是一贯的直接上例子:我们写了两个实体类,TGroup和TUser
public class TGroup implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String name;
private TUser user;
//省略Get/Set方法
}
public class TUser implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private int age;
private String name;
private TGroup group;
//省略Get/Set方法
}
实体类完了我们就看一下映射文件:
<hibernate-mapping package="org.hibernate.tutorial.domain5">
<class name="TUser" table="USER5">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" type="java.lang.String" column="name"/>
<property name="age" type="java.lang.Integer" column="age"/>
<many-to-one name="group" class="TGroup" column="group_id" unique="true" />
</class>
</hibernate-mapping>
这里我们看到是用many-to-one标签而不是one-to-one,为什么呢?
这里以前用的时候也没多在注意,反正会用就行,但这次看了夏昕的书终于明白了,实际上这种通过外键进行关联方式只是多对一的一种特殊方式而已,我们通过unique="true"限定了它必须只能有一个,即实现了一对一的关联。
接下来我们看一下TGroup的映射文件:
<hibernate-mapping package="org.hibernate.tutorial.domain5">
<class name="TGroup" table="group5">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" type="java.lang.String" column="name"/>
<one-to-one name="user" class="TUser" property-ref="group" />
</class>
</hibernate-mapping>
这里,注意,我们又用到了one-to-one,表明当前的实体和TUser是一对一的关系,这里我们不用many-to-one,而是通过one-to-one指定了TUser实体中通过哪个属性来关联当前的类TGroup。这里我们指定了TUser是通过group属性和Tuser进行关联的。property-ref指定了通过哪个属性进行关联。
下面我们看测试类:
public class HibernateTest {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
TGroup group = new TGroup();
group.setName("testGroup");
TUser user = new TUser();
user.setAge(23);
user.setName("test");
user.setGroup(group);
group.setUser(user);
session.save(group);
session.save(user);
session.getTransaction().commit();
session.close();
}
}
注意,这次我们的代码中需要进行两次的保存,因为它们对各自都有相应的对应,只保存一个都不会对另外一个有什么操作。所以我们需要调用两次保存的操作。最后进行提交。
hibernate打印出语句:
Hibernate: insert into group5 (name) values (?)
Hibernate: insert into USER5 (name, age, group_id) values (?, ?, ?)
这说明我们正确地存入了两个对象值。
我们写多一个测试类进行查询:
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
TUser user = (TUser)session.load(TUser.class,new Integer(1));
System.out.println("From User get Group:"+user.getGroup().getName());
TGroup group = (TGroup)session.load(TGroup.class,new Integer(1));
System.out.println("From Group get User:" + group.getUser().getName());
session.close();
}
我们都可以得到正确的结果,这表明我们可以通过两个对象拿出对方的值,达到了我们的目的。
这个例子中用到的TGroup和TUser只是例子而已,实际上现实生活中的user一般都对应多个group。
分享到:
相关推荐
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...
博文链接:https://shaqiang32.iteye.com/blog/201311
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
博文链接:https://shaqiang32.iteye.com/blog/201312
hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向
NULL 博文链接:https://12345678.iteye.com/blog/723871
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
博文链接:https://llying.iteye.com/blog/220804
博文链接:https://llying.iteye.com/blog/220807
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
011 一对一 唯一外键关联映射_单向 012 一对一 唯一外键关联映射_双向 013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中...
其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。 1.共享主键的...
NULL 博文链接:https://lijunabc.iteye.com/blog/438972
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2243079
hibernate一对一唯一外键关联映射(单向关联Person---->IdCard) 10 hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard) 11 session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射...
:Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。 共享主键方式: 所谓共享主键方式就是限制两个数据表的主键使用相同的值