最近在使用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;
}
}
<?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>
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属性。
本文介绍了Hibernate中实现一对一关系的两种方法:主键双向关联和外键关联,并提供了详细的实体类及XML配置示例。

3737

被折叠的 条评论
为什么被折叠?



