hibernate主键相同的一对一关系
来源:互联网 发布:人工智能对生活的影响 编辑:程序博客网 时间:2024/04/27 17:53
由于两个实体类是一对一的关系,因此可以设置两个实体类使用相同的主键。相对的,具有相同注解的实体被视为一对一的关系,这样两个表就省略了外键关联。
demo实例
客户地址管理,一个客户对应一个地址,实体间使用相同的主键。
1、建立java工程
2、导入hibernate和MySql相关类库。
详见之前的博客hibernate单边一对多关系中的配置。
3、建立实体类
Customer为客户的实体类,Address为客户的地址实体类;
两个实体类之间是一对一的属性,两者之间使用相同的主键而没有使用外键约束。
配置时使用OneToOne指定一对一关系,使用@PrimaryKeyJoinColumn指定两个实体类之间使用相同的主键。
客户的实体类Customer.java代码如下:
package com.arvinfei.hibernate.bean;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToOne;import javax.persistence.PrimaryKeyJoinColumn;import javax.persistence.Table;@Entity@Table(name = "tb_customer")public class Customer {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;private String name;@OneToOne@PrimaryKeyJoinColumnprivate Address address;public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}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;}}
地址的实体类Address.java代码如下:两个实体类使用主键进行一对一关联,这里两个主键为整形,其中客户使用了自增长属性,那么地址就不能在使用自增长属性,否则可能会是两个实体对象的id不一致。hibernate也不会自动保证两个id相同,此时需要手动设置id以保证两个id一致(即将客户自动分配到的id设置给地址)。
package com.arvinfei.hibernate.bean;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.OneToOne;import javax.persistence.PrimaryKeyJoinColumn;import javax.persistence.Table;@Entity@Table(name = "tb_address")public class Address {@Id// @GeneratedValue(strategy = GenerationType.IDENTITY)//不使用自动增长private Integer id;@OneToOne@PrimaryKeyJoinColumnprivate Customer customer;private String address;private String zip;private String telephone;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public String getZip() {return zip;}public void setZip(String zip) {this.zip = zip;}}
4、在hibernate的配置文件中添加实体类映射关系
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration><session-factory> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.url"> jdbc:mysql://localhost:3306/one2onebykey?characterEncoding=UTF-8 </property> <property name="connection.username">root</property> <property name="connection.password">admin</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping class="com.arvinfei.hibernate.bean.Address" /> <mapping class="com.arvinfei.hibernate.bean.Customer" /></session-factory></hibernate-configuration>
5、新建测试代码
package com.arvinfei.hibernate.test;import java.util.List;import org.hibernate.Session;import com.arvinfei.hibernate.bean.Address;import com.arvinfei.hibernate.bean.Customer;import com.arvinfei.hibernate.util.HibernateSessionFactory;public class One2OneKey {@SuppressWarnings("all")public static void main(String[] args) throws Exception {Customer customer = new Customer();customer.setName("Helloween");Address address = new Address();address.setAddress("北京市海淀区中关村");address.setTelephone("010-77883210");address.setZip("100001");// address.setCustomer(customer);Session session = HibernateSessionFactory.getSession();session.beginTransaction();// 保存 customer,数据库会为 customer 自动分配 IDsession.persist(customer);// 要手工设置 address 的 ID 保证两个ID一致address.setId(customer.getId());// 保存 addresssession.persist(address);session.flush();List<Customer> list = session.createQuery(" select c from Customer c where c.name = :name ").setParameter("name", "Helloween").list();for (Customer c : list) {session.refresh(c);System.out.println("客户姓名:" + c.getName());System.out.println("\t电话:" + c.getAddress().getTelephone());System.out.println("\t邮编:" + c.getAddress().getZip());System.out.println("\t地址:" + c.getAddress().getAddress());}session.getTransaction().commit();session.close();}}
6、修改HibernateSessionFactory
修改HibernateSessionFactory中的sessionFactory配置方式,默认为xml配置方式,demo中使用注解进行配置,所以需要进行简单修改。
7、运行测试
(1)、打开并连接到mysql数据库;
(2)、在mysql中创建Many2Many数据库;
create database one2onebykey character set 'utf8';
(3)、运行本测试工程,查看log输出。
8、源码下载
http://download.csdn.net/detail/yxtouch/9161295
0 0
- hibernate主键相同的一对一关系
- Hibernate实体关系映射——主键相同的一对一关系
- Hibernate基于主键的一对一映射关系
- Hibernate之基于主键映射的一对一关联关系
- Hibernate基于主键的一对一关系----单向双向
- Hibernate关联关系之一对一(主键关联)
- hibernate 关联关系 一对一 主键关联
- hibernate实现一对一关系映射(基于主键)
- Hibernate关联关系之单向主键一对一
- Hibernate的一对一关系
- hibernate的一对一主键双向映射关系和外键双向映射关系(一)
- Hibernate,一对一的关联关系
- hibernate单边的一对一关系
- hibernate双边的一对一关系
- Hibernate的一对一关联关系
- Hibernate中表的一对一关系
- 基于主键的一对一关联关系
- 基于主键的一对一关联关系
- Ubuntu root 密码忘记-恢复
- ocp-188
- Spark SQL 1.3.0 DataFrame介绍、使用
- 01背包问题
- jQuery Mobile基础02----jQuery Mobile Widgets-page(跳转效果
- hibernate主键相同的一对一关系
- UVA1641 - ASCII Area
- 弱校联萌十一大决战之背水一战AA Big Dinner
- 学习
- jQuery Mobile基础03----jQuery Mobile Widgets-button
- NRF905模式切换问题
- Codeforces 583A Asphalting Roads
- Android 通讯录
- 生活