Hibernate进阶之双向一对一关系映射

上一篇介绍了Hibernate的双向一对多关系,接下还是用代码介绍一下Hibernate进阶之双向一对一关系映射。

首先做一下总结:

二)双向一对一关系【人 和身份证】 ,也可以要外键,也可以不要外键 ,一般在物品一方放置外键
    Person.hbm.xml文件
    <one-to-one name="card" class="Card" cascade="all"/>
    Card.hbm.xml文件
    <one-to-one name="person" class="Person" constrained="true"/>
   (1)保存人,级联保存身份证
   (2)查询人,对象导航查询身份证

注意:由于主键和外键重复,所以把主键当做外键。例如:

Person表
id name age
1 小明 14
2 小海 17
Card表
id cardno location person_id
1 28838389 广东    1
2 55322223 广西    2

因此 person_id这一列可以省略掉。

第一步:在mysql数据库中创建数据库如下;

create table person2(
id int(5) primary key auto_increment,
name varchar(255),
age int(5)
);

create table card(
id int(5) primary key auto_increment,
cardno varchar(255),
location varchar(255),
constraint card_person_FK foreign key(id) references  person2(id)
);

第二步,写实体类:Person,Card。

Person类:

package example.one2one_double;

import java.io.Serializable;

/**
 * 人:单方
 * @author Administrator
 *
 */
public class Person implements Serializable{

	private Integer id;
	private String name;
	private Integer age;
	private Card card;//关联属性
	
	
	public Card getCard() {
		return card;
	}
	public void setCard(Card card) {
		this.card = card;
	}
	public Person(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	
}

Card类:

package example.one2one_double;
/**
 * 身份证:单方
 * @author Administrator
 *
 */
public class Card {

	private Integer id;
	private String cardNo;
	private String location;
	private Person person;//关联属性
	
	
	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}

	public Card(){}

	public Card(String cardNo, String location) {
		super();
		this.cardNo = cardNo;
		this.location = location;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}
	
}

第三步,配置映射文件PersonCard.hbm.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="example.one2one_double">
   <!--Person类的一方  -->
	<class name="Person" table="person2">
		<id name="id" column="id" type="int">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="age" column="age" type="int"></property>
		<!-- 
		·<one-to-one >标签认识:
		name属性表示关联的属性名
		class表示关联的属性的类型
		 -->
		<one-to-one name="card" class="Card" cascade="all"></one-to-one>
	</class>
	<!-- Card类的一方 -->
	<class name="Card" table="card">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		<property name="cardNo" column="cardno"></property>
		<property name="location" column="location"></property>
		<!-- 
		·<one-to-one >标签认识:
		name属性表示关联的属性名
		class表示关联的属性的类型
		constrained表示主键是否有外键约束
		constrained=false表示主键没有外键约束
		constrained=true表示主键有外键约束
		 -->
		<one-to-one name="person" class="Person" constrained="true"></one-to-one>
	</class>
</hibernate-mapping>
第四步,写测试类PersonCardDao:

PersonCardDao类:

package example.one2one_double;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import example.utils.HibernateUtils;

public class PersonCardDao {

	/**
	 * 保存人,级联保存身份证
	 */
	@Test
	public void test01(){
		Person person=new Person("小宁",17);
		Card card=new Card("20309393030","广东");
		//设置双向关联
		person.setCard(card);
		card.setPerson(person);
		Session session=HibernateUtils.getSession();
		Transaction t=session.getTransaction();
		try{
			t.begin();
			session.save(person);
			t.commit();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			t.rollback();
		}
	}
	
	/**
	 * 查询人,对象导航查询身份证
	 */
	@Test
	public void test02(){
		Session session=HibernateUtils.getSession();
		Transaction t=session.getTransaction();
		try{
			t.begin();
			Person p=(Person) session.get(Person.class, 1);
			Card card=p.getCard();
			System.out.println(card.getCardNo()+","+card.getLocation());
			t.commit();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			t.rollback();
		}
	}
}

运行结果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select person0_.id as id2_1_, person0_.name as name2_1_, person0_.age as age2_1_, card1_.id as id3_0_, card1_.cardno as cardno3_0_, card1_.location as location3_0_ from person2 person0_ left outer join card card1_ on person0_.id=card1_.id where person0_.id=?
20309393030,广东






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate是一个Java持久化框架,它能够将Java对象映射到数据库中的表格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多和多对多的关系,我们可以通过以下方式进行映射一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间表来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间表中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表的表名和两个外键的列名。 总结:通过Hibernate的注解方式,可以方便地实现一对一、一对多和多对多关系映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成表结构的功能,可以根据Java实体类来动态创建或更新对应的数据库表格,从而提高系统的可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值