`

第九章Hibernate映射一对一关联关系

阅读更多

第九章Hibernate映射一对一关联关系

  • 共享主键关联
  • 唯一外键关联

   1.两个关联表使用相同的主键值

 

 数据准备:

-- Create table
create table USERS1
(
  USERNAME VARCHAR2(40),
  PASSWORD VARCHAR2(40),
  ID       NUMBER(8) not null
)

 Profile表用于保存用户的其他信息。

-- Create table
create table PROFILE
(
  ID       NUMBER(8) not null,
  EMAIL    VARCHAR2(200),
  PHONE    VARCHAR2(20),
  MOBILE   VARCHAR2(20),
  ADDRESS  VARCHAR2(200),
  POSTCODE VARCHAR2(10)
)

 其中,ID即是主键又是外键。因此称为共享主键。

  User:

public class User implements java.io.Serializable {
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String username;
	private String password;
	private Profile profile;

	public Profile getProfile() {
		return profile;
	}

	public void setProfile(Profile profile) {
		this.profile = profile;
	}

	public User() {
	}

	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;
	}
}

 User映射配置:

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.User" table="USERS1" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment"></generator>
        </id>
        <property name="username" type="java.lang.String">
            <column name="USERNAME" length="40" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="40" />
        </property>
        <one-to-one name="profile" class="com.crazy.Profile"></one-to-one>
    </class>
</hibernate-mapping>
 

 Profile类:

public class Profile implements java.io.Serializable {
	private Integer id;
	private String email;
	private String phone;
	private String mobile;
	private String address;
	private String postcode;
	private User user;

	public Profile() {
	}

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

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

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPhone() {
		return this.phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getMobile() {
		return this.mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

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

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

	public String getPostcode() {
		return this.postcode;
	}

	public void setPostcode(String postcode) {
		this.postcode = postcode;
	}
}

  Profile映射配置:

  其主键是使用user的。

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Profile" table="PROFILE" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="foreign">
            	<param name="property">user</param>
            </generator>
        </id>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" length="200" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" length="20" />
        </property>
        <property name="mobile" type="java.lang.String">
            <column name="MOBILE" length="20" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="ADDRESS" length="200" />
        </property>
        <property name="postcode" type="java.lang.String">
            <column name="POSTCODE" length="10" />
        </property>
        <one-to-one name="user" class="com.crazy.User"></one-to-one>
    </class>
</hibernate-mapping> 

   测试代码:

public class HibernateTest {

	public static void main(String args[]){
		HibernateTest test = new HibernateTest();
		test.add();
	}
	
	public void add(){
		Profile profile = new Profile();
		profile.setAddress("河南胜利路");
		profile.setEmail("yesmeshtu2008@163.com");
		profile.setMobile("13301239472145");
		User user = new User();
		profile.setUser(user);
		user.setUsername("grass");
		user.setPassword("123");
		user.setProfile(profile);
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		session.beginTransaction();
		session.save(profile);
		session.save(user);
		session.getTransaction().commit();
	}
}

   2.多对一关联的特殊形式,要求多方唯一

   User类:

public class User  implements java.io.Serializable {
     private Integer id;
     private String username;
     private String password;
     private Profile profile;
     
    public Profile getProfile() {
		return profile;
	}

	public void setProfile(Profile profile) {
		this.profile = profile;
	}

	public User() {
    }
    
    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;
    }
}

   User映射配置:

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.User" table="USERS1" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="USERNAME" length="40" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="40" />
        </property>
        <one-to-one name="profile" class="com.crazy.Profile"></one-to-one>
    </class>
</hibernate-mapping>

   Profile类:

 

public class Profile  implements java.io.Serializable {
     private Integer id;
     private String email;
     private String phone;
     private String mobile;
     private String address;
     private String postcode;
     private User user;

    public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public Profile() {
    }

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

    public String getEmail() {
        return this.email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return this.phone;
    }
    
    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getMobile() {
        return this.mobile;
    }
    
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

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

    public String getPostcode() {
        return this.postcode;
    }
    
    public void setPostcode(String postcode) {
        this.postcode = postcode;
    }
}

   Profile映射配置:

<?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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.crazy.Profile" table="PROFILE1" schema="SCOTT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="increment" />
        </id>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" length="200" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" length="20" />
        </property>
        <property name="mobile" type="java.lang.String">
            <column name="MOBILE" length="20" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="ADDRESS" length="200" />
        </property>
        <property name="postcode" type="java.lang.String">
            <column name="POSTCODE" length="10" />
        </property>
        <many-to-one name="user" class="com.crazy.User" unique="true">
        	<column name="user_id"></column>
        </many-to-one>
    </class>
</hibernate-mapping>

   配置如下:

  <many-to-one name="user" class="com.crazy.User" unique="true">
        	<column name="user_id"></column>
        </many-to-one>

  测试代码:

public class HibernateTest {

	public static void main(String args[]){
		HibernateTest test = new HibernateTest();
		test.add();
	}
	
	public void add(){
		Profile profile = new Profile();
		profile.setAddress("河南胜利路");
		profile.setEmail("yesmeshtu2008@163.com");
		profile.setMobile("13309472145");
		User user = new User();
		profile.setUser(user);
		user.setUsername("grass");
		user.setPassword("123");
		user.setProfile(profile);
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		session.beginTransaction();
		session.save(profile);
		session.save(user);
		
		session.getTransaction().commit();
	}
}
 
分享到:
评论

相关推荐

    Hibernate关联关系映射目录

    ### Hibernate关联关系映射 #### 一、单向关联 单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 ...

    hibernate一对多,多对一,一对多双向关联

    由于只给出了"hibernate_003"这个文件名,我们无法直接获取具体信息,但可以猜测这是一个系列教程的一部分,"003"可能是表示序列号,表示这是关于Hibernate关联关系的第三个主题或者第三部分。 **详细知识点:** 1...

    hibernate多对多双向关联

    10. **最佳实践**:如避免过多的中间表查询,合理设计关联关系,以及在不必要时选择一对一或一对多替代多对多等。 总结来说,理解并能正确使用Hibernate中的多对多双向关联是Java开发中的重要技能,涉及到实体设计...

    Hibernate ORM - 一对多双向组合关联关系

    9. **缓存机制**:理解Hibernate的第一级缓存(Session缓存)和第二级缓存(可选,如EHCache),它们如何影响一对多关联的读写操作。 10. **性能考虑**:在设计一对多双向组合关联时,要考虑到查询效率、内存消耗等...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    Accp6.0 Y2 Hibernate1-2章上机练习和课后代码

    7. **一对多、多对一、多对多关系映射**:在chapter02的实践中,你可能遇到实体类之间的一对多、多对一或者多对多关系。Hibernate提供了多种方式来处理这些关系,例如集合映射、联接表等。 8. **懒加载和立即加载**...

    菜鸟快速运行第一个hibernate

    9. **一对多、多对一、多对多关系映射**:在数据库中,不同表之间的关联关系需要在实体类中通过注解或XML配置来映射,例如@OneToMany、@ManyToOne、@ManyToMany。 10. **延迟加载和级联操作**:Hibernate的延迟加载...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    北大青鸟Y2使用Hibernate开发租房系统8-11章全

    第十章可能会涉及更复杂的查询技巧,如多对一、一对多、多对多等关联关系的处理。Hibernate提供了多种关联映射方式,例如使用@OneToOne、@ManyToOne、@OneToMany和@ManyToMany注解。这一章还会讨论级联操作,使得在...

    精通Hibernate:Java持久化对象技术详解[第二版]

    3. **实体映射**:详述如何使用Hibernate的XML映射文件(hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括字段映射、关联映射(一对一、一对多、多对多)等。 4. **Session与Transaction**:深入理解...

    hibernate学习资料大全

    Hibernate 支持各种关联映射,如一对一、一对多、多对一和多对多。理解这些关联关系的建立和查询,能够帮助开发者设计出更灵活的数据模型。 8. **缓存机制**: Hibernate 提供了第一级缓存和第二级缓存,以及查询...

    hibernate的一个简单例程

    Hibernate支持多种对象关系映射,如一对一、一对多、多对多等,通过配置文件或注解定义实体间的关联。 **知识点九:懒加载和立即加载** Hibernate提供了懒加载和立即加载策略,以控制关联对象的加载时机。懒加载...

    2017黑马程序员第一天Hibernate讲义,笔记,源码

    8. **一对多、多对一、一对一关联映射**:这些关系映射是ORM框架的核心功能,用于处理数据库中的关联关系。 9. **继承映射**:支持单表继承、联合继承和表-per-hierarchy等多种策略,使得Java类的继承关系能够自然...

    Hibernate实战(第2版 中文高清版)

     7.3.1 多态的多对一关联   7.3.2 多态集合   7.3.3 对联合的多态关联   7.3.4 每个具体类一张多态表   7.4 小结   第8章 遗留数据库和定制SQL   8.1 整合遗留数据库   8.1.1 处理主键   8.1.2 带...

    hibernate 3.6 中文 chm

    10. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持多种关联映射,包括集合映射,如List、Set、Map等,以及复合主键的处理。 11. **继承映射**:在Java中,子类可以继承父类。在Hibernate中,这种继承...

    Hibernate\hibernate3.2官方中文参考手册PDF

    5. **关联映射**:Hibernate支持多种对象之间的关联映射,包括一对一、一对多、多对一、多对多关系。这些关联可以在配置文件中定义,或者使用JPA注解来声明。 6. **集合映射**:在处理一对多、多对多关联时,...

    学习hibernate的第二章

    7. **关联映射**:在Hibernate中,我们可以轻松地处理一对一、一对多、多对一和多对多的关联关系。通过配置文件或注解,可以定义实体间的关联,如外键映射、集合映射等。 8. **延迟加载**(Lazy Loading):为了...

Global site tag (gtag.js) - Google Analytics