• 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 |


  • 相关阅读:
    我们都可以把它放 Sidecar 容器中,这样微服务具备了 Super power,一种超能力
    DP 状态 DP 转移方程 动态规划解题思路
    完全二叉树 原因 完全二叉树最后一层节点靠左的原因
    延时任务最佳实践方案总结
    b+ 树 只存储 索引
    埋点质量保障体系建设
    linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <
    卡特兰数
    python 使用函数名的字符串调用函数(4种方法)_black-heart的专栏-CSDN博客 https://blog.csdn.net/mrqingyu/article/details/84403924
    12 | 服务注册与发现如何满足服务治理
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131566.html
Copyright © 2020-2023  润新知