zoukankan      html  css  js  c++  java
  • Hibernate之onetoone外键关联映射

    在hibernate一对一实体映射中,常用有两种方式,一种就是把一对一看作多对一的一个特例,即通过外键参考。

    另一种是通过主键参考,限制两个数据表中的主键使用相同的值。

    po类

    Person.java

    package po;
    
    public class Person {
    	private int id;        
    	private String name;  //姓名
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    }
    

    Card.java

    package po;
    
    public class Card {
    	private int id;          //身份证ID
    	private String number;   //身份证号码
    	private Person person;   //一个身份证号对应一个人
    	
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getNumber() {
    		return number;
    	}
    	public void setNumber(String number) {
    		this.number = number;
    	}
    	public Person getPerson() {
    		return person;
    	}
    	public void setPerson(Person person) {
    		this.person = person;
    	}
    	
    	
    	
    	
    }
    

    Card.hbm.xml

    <hibernate-mapping>
        <class name="po.Card" table="card">
            <id name="id" type="integer">
                <generator class="native" />
            </id>
            <property name="number"></property>
            <!-- 是多对一的一种特例  unique=true设置为唯一关联 -->
            <many-to-one name="person" unique="true" column="person"></many-to-one>
        </class>
    </hibernate-mapping>

    Person.hbm.xml

    <hibernate-mapping>
    	<class name="po.Person" table="person">
    		<id name="id" type="integer">
    			<generator class="native" />
    		</id>
    		<property name="name" />
    		
    	</class>
    </hibernate-mapping>

    hibernate.cfg.xml

    <hibernate-configuration>
    
        <session-factory>
           <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    		<property name="connection.username">root</property>
    		<property name="connection.password">1</property>
    		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    		<property name="myeclipse.connection.profile">mysql</property>
    		<property name="show_sql">true</property>
    		<property name="format_sql">true</property>
       	    <mapping resource="po/Person.hbm.xml"/>
       	    <mapping resource="po/Card.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

    Test.java

    package po;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;
    import org.junit.Test;
    
    
    public class PersonTest {
    	
    	@Test
    	public void testCreateDB(){
    		//生成表结构
    		Configuration config = new Configuration().configure();
    		SchemaExport export = new SchemaExport(config);
    		export.create(true, true);
    	}
    	@Test
    	public void testSave(){
    		//测试 添加数据 
    		Configuration config = new Configuration().configure();
    		SessionFactory factory = config.buildSessionFactory();
    		Session session = factory.openSession();
    		session.beginTransaction();
    		
    	   
    		Person person = new Person();   //先有person然后才能有省份证
    		person.setName("zhangsan");
    		session.save(person);         //一对一外键关联时 必须先保存person
    		
    		
    		Card card = new Card();
    		card.setNumber("4114031111222223333");
    		card.setPerson(person);       //此身份证属于此人
    		session.save(card);           //保存card
    		
    		session.getTransaction().commit();
    		
    	} 
    	@Test
    	public void testGetPerson(){
    		Configuration config = new Configuration().configure();
    		SessionFactory factory = config.buildSessionFactory();
    		Session session = factory.openSession();
    	    session.beginTransaction();
    
            Card card = (Card)session.get(Card.class,2 ); //取出Card
            System.out.println("CardNumber: "+card.getNumber());
            
            Person person = card.getPerson();  //通过card.getPerson()方法 返回person
            System.out.println("PersonName: "+person.getName()); //取出person的name
    	    
    	    session.getTransaction().commit();
    	    session.close();
    	}
    }
    

    person和card分别生成sql为:

    | card  | CREATE TABLE `card` (
      `id` int(11) NOT NULL auto_increment,
      `number` varchar(255) default NULL,
      `person` int(11) default NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `person` (`person`),
      KEY `FK2E7B10BD1DCD99` (`person`),
      CONSTRAINT `FK2E7B10BD1DCD99` FOREIGN KEY (`person`) REFERENCES `person` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    
    
    | person | CREATE TABLE `person` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(255) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |


  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131566.html
Copyright © 2011-2022 走看看