Hibernate一一映射

本文介绍了Hibernate中实现一对一关系的两种方法:主键双向关联和外键关联,并提供了详细的实体类及XML配置示例。

最近在使用hibernate时,需要用到一一映射的关系,因此整理出两种不同的关联形式,记载下来以便自己记忆和其他朋友参考:

1)主键双向关联:

Person实体:

public class Person implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private Location location;

	// Constructors

	/** default constructor */
	public Person() {
	}

	/** full constructor */
	public Person(String name) {
		this.name = name;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

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

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Location getLocation() {
		return location;
	}

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

}


Person.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">

<hibernate-mapping>
    <class name="com.entity.Person" table="Person" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <one-to-one name="location"></one-to-one>
        <property name="name" type="java.lang.String">
            <column name="name" length="50" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

Location实体:

public class Location implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String address;
	private Person person;

	// Constructors

	/** default constructor */
	public Location() {
	}

	/** full constructor */
	public Location(String address) {
		this.address = address;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

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

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public Person getPerson() {
		return person;
	}

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

}

Location.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">

<hibernate-mapping>
    <class name="com.entity.Location" table="Location" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="foreign" >
            	<param name="property">person</param>
            </generator>
        </id>
        <one-to-one name="person" constrained="true"></one-to-one>
        <property name="address" type="java.lang.String">
            <column name="address" length="50" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


测试代码:

public class PrimaryKeyOne2One {

	Session session;
	@Before
	public void prepare(){
		session=HibernateSessionFactory.getSession();
	}
	
	@Test
	public void insert(){
		Transaction transaction = null;
		try {
			transaction=session.beginTransaction();
			
			Person person = new Person();
			person.setName("帕蒂唐");
			
			Location location = new Location();
			location.setAddress("广东省");
			location.setPerson(person);
			
			//session.save(person);
			session.save(location);
			
			transaction.commit();
		} catch (HibernateException e) {
			// TODO: handle exception
			if(transaction!=null)
				transaction.rollback();
		}
	}
	
	@Test
	public void proceed(){
		Person person=(Person)session.get(Person.class, 2);
		System.out.println(person.getLocation().getAddress());
	}	
	@After
	public void exit(){
		HibernateSessionFactory.closeSession();
	}
}



2)外键关联



User实体:

public class User implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private Account account;
	
	public User(){}
	
	public User(Integer id){
		this.id = id;
	}
	
	public User(String name,Account account){
		this.name=name;
		this.account=account;
	}

	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 Account getAccount() {
		return account;
	}

	public void setAccount(Account account) {
		this.account = account;
	}

}

User.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">
<hibernate-mapping>
    <class name="com.entity.User" table="t_user" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="50" not-null="true" />
        </property>
       	<many-to-one name="account" class="com.entity.Account" unique="true" cascade="all" column="account"></many-to-one>
    </class>
</hibernate-mapping>


Account实体:

public class Account implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private Integer money;

	// Constructors

	/** default constructor */
	public Account() {
	}

	/** full constructor */
	public Account(Integer money) {
		this.money = money;
	
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

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

	public Integer getMoney() {
		return this.money;
	}

	public void setMoney(Integer money) {
		this.money = money;
	}


}

Account.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">
<hibernate-mapping>
    <class name="com.entity.Account" table="Account" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="money" type="java.lang.Integer">
            <column name="money" not-null="true" />
        </property>
      <!-- <one-to-one name="user" class="com.entity.User" cascade="all" constrained="true"></one-to-one>  --> 
    </class>
</hibernate-mapping>

测试代码:

public class One2OneRelationTest {

	Session session;
	@Before
	public void prepare(){
		session=HibernateSessionFactory.getSession();
	}
	
	@Test
	public void insert(){
		Transaction transaction = null;
		try {
			transaction=session.beginTransaction();
			
			Account account = new Account();
			account.setMoney(10000);
			
			User usr = new User();
			usr.setName("paditang");
			usr.setAccount(account);
			
			session.save(usr);
			
			transaction.commit();
		} catch (HibernateException e) {
			// TODO: handle exception
			if(transaction!=null)
				transaction.rollback();
		}
	}
	/*@Test
	public void Select(){
		User user = (User)session.get(User.class, 3);
		String name = user.getName();
		System.out.println(name);
		Account account = user.getAccount();
		System.out.println(account.getMoney());
	}*/
	/*@Test
	public void delete(){
		Transaction transaction = null;
		try {
			transaction=session.beginTransaction();
			
			session.delete(new User(1));
			
			transaction.commit();
		} catch (HibernateException e) {
			// TODO: handle exception
			if(transaction!=null)
				transaction.rollback();
		}
	}*/
	@After
	public void exit(){
		HibernateSessionFactory.closeSession();
	}
}

3)外键双向关联

只需要注意在主键那一方,在<one-to-one >下 设置property-ref属性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值