文档章节

Hibernate映射联合主键(详细)

Airship
 Airship
发布于 2017/02/03 23:26
字数 836
阅读 7
收藏 0

数据库建表语句为:

CREATE TABLE `T_PERSON` (  
  `firstname` VARCHAR(10) NOT NULL,  
  `lastname` VARCHAR(10) NOT NULL,  
  `address` VARCHAR(20),  
  `phone` int(10) unsigned,  
  PRIMARY KEY (`firstname`,`lastname`)  
) ENGINE=InnoDB DEFAULT CHARSET=gb2312; 

方式一:基于实体类属性

对于实体的PO类,有2个要求:

1,必须继承Serializable接口

2,必须重写equals()方法和hashcode()方法(个人认为不是必须重写,只要其默认hascode能唯一的确定任何一个Person类即可,当然使用联合主键字段firstname和lastname重写equals()方法和hashcode()方法后,即可通过firstname和lastname唯一确定一个Person类,更符合数据库中firstname和lastname做为联合主键的设计)

public class Person implements Serializable{  
    private static final long serialVersionUID = 1L;  
    private String firstname;  
    private String lastname;  
    private String address;  
    private Integer phone;  
      
    public Person(){}  
      
    public String getFirstname() {  
        return firstname;  
    }  
    public void setFirstname(String firstname) {  
        this.firstname = firstname;  
    }  
    public String getLastname() {  
        return lastname;  
    }  
    public void setLastname(String lastname) {  
        this.lastname = lastname;  
    }  
    public String getAddress() {  
        return address;  
    }  
    public void setAddress(String address) {  
        this.address = address;  
    }  
    public Integer getPhone() {  
        return phone;  
    }  
    public void setPhone(Integer phone) {  
        this.phone = phone;  
    }  
      
    public int hashCode() {  
        return getFirstname().hashCode()*11 +   
                getLastname().hashCode();  
    }  
      
    public boolean equals(Object obj) {  
        if(null == obj){  
            return false;  
        }  
        if(this == obj){  
            return true;  
        }  
        if(obj.getClass() == Person.class){  
            Person p = (Person)obj;  
            if(p.getFirstname().equals(getFirstname()) &&  
                    p.getLastname().equals(getLastname())){  
                return true;  
            }  
        }  
        return false;  
    }  
}  

PO类配置文件Person.hbm.xml:

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  
<hibernate-mapping>  
    <class name="com.po.Person" table="T_PERSON">  
        <composite-id>  
            <key-property name="firstname" column="firstname" type="string"/>  
            <key-property name="lastname" column="lastname" type="string"/>  
        </composite-id>  
        <property name="address" column="address" type="string"/>  
        <property name="phone" column="phone" type="integer"/>  
    </class>  
</hibernate-mapping>  

hibernate配置文件hibernate.cfg.xml:

<?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">  
  
<hibernate-configuration>  
    <session-factory>  
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
        <property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>  
        <property name="connection.username">root</property>  
        <property name="connection.password">196428</property>  
          
        <property name="hibernate.jdbc.batch_size">50</property>  
          
        <mapping resource="com/po/Person.hbm.xml" />  
    </session-factory>  
</hibernate-configuration> 

  

测试类:

public class Test {  
    public static void main(String[] args) {  
        Configuration conf = new Configuration();  
        SessionFactory sessionFactory = conf.configure().buildSessionFactory();  
        Session session = sessionFactory.openSession();  
        Transaction tr = session.beginTransaction();  
          
        Person p1 = new Person();  
        p1.setFirstname("sean");  
        p1.setLastname("zou");  
        p1.setAddress("address");  
        p1.setPhone(123);  
        session.save(p1);  
        System.out.println("save successfully!");  
          
        Person p2 = new Person();  
        p2.setFirstname("sean");  
        p2.setLastname("zou");  
        p2 = (Person)session.get(Person.class,p2);  
        p2.setFirstname("angel");  
        p2.setLastname("baby");  
        p2.setAddress("address2");  
        p2.setPhone(123);  
        session.merge(p2);  
        System.out.println("merge successfully!");  
              
        tr.commit();  
        session.close();  
    }  
}  

运行结果为:

save successfully!  
merge successfully!  

最终数据库里只有一条数据:

 

firstname

lastname

address

phone

angel

baby

address2

123

 

方式二:基于主键类

public class PersonPK implements Serializable{  
    private static final long serialVersionUID = 1L;  
    private String firstname;  
    private String lastname;  
      
    public String getFirstname() {  
        return firstname;  
    }  
    public void setFirstname(String firstname) {  
        this.firstname = firstname;  
    }  
    public String getLastname() {  
        return lastname;  
    }  
    public void setLastname(String lastname) {  
        this.lastname = lastname;  
    }  
      
    public int hashCode() {  
        return getFirstname().hashCode()*11 +   
                getLastname().hashCode();  
    }  
      
    public boolean equals(Object obj) {  
        if(null == obj){  
            return false;  
        }  
        if(this == obj){  
            return true;  
        }  
        if(obj.getClass() == PersonPK.class){  
            PersonPK pk = (PersonPK)obj;  
            if(pk.getFirstname().equals(getFirstname()) &&  
                    pk.getLastname().equals(getLastname())){  
                return true;  
            }  
        }  
        return false;  
    }  
}  
public class Person implements Serializable{  
    private static final long serialVersionUID = 1L;  
    private PersonPK personPK;  
    private String address;  
    private Integer phone;  
      
    public Person(){}  
      
    public PersonPK getPersonPK() {  
        return personPK;  
    }  
    public void setPersonPK(PersonPK personPK) {  
        this.personPK = personPK;  
    }  
    public String getAddress() {  
        return address;  
    }  
    public void setAddress(String address) {  
        this.address = address;  
    }  
    public Integer getPhone() {  
        return phone;  
    }  
    public void setPhone(Integer phone) {  
        this.phone = phone;  
    }  
}  
<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  
<hibernate-mapping>  
    <class name="com.po.Person" table="T_PERSON">  
        <composite-id name="personPK" class="com.po.PersonPK">  
            <key-property name="firstname" column="firstname" type="string"/>  
            <key-property name="lastname" column="lastname" type="string"/>  
        </composite-id>  
        <property name="address" column="address" type="string"/>  
        <property name="phone" column="phone" type="integer"/>  
    </class>  
</hibernate-mapping> 
public class Test {  
    public static void main(String[] args) {  
        Configuration conf = new Configuration();  
        SessionFactory sessionFactory = conf.configure().buildSessionFactory();  
        Session session = sessionFactory.openSession();  
        Transaction tr = session.beginTransaction();  
          
        PersonPK pk = new PersonPK();  
        pk.setFirstname("sean");  
        pk.setLastname("zou");  
          
        Person p1 = new Person();  
        p1.setPersonPK(pk);  
        p1.setAddress("address");  
        p1.setPhone(123);  
        session.save(p1);  
        System.out.println("save successfully!");  
          
        Person p2 = (Person)session.get(Person.class,pk);  
        p2.setAddress("address2");  
        p2.setPhone(123);  
        session.merge(p2);  
        System.out.println("merge successfully!");  
              
        tr.commit();  
        session.close();  
    }  
}  

运行结果为:

save successfully!  
merge successfully!  

最终数据库里只有一条数据:

 

firstname

lastname

address

phone

sean

zou

address2

123

 

本文转载自:http://blog.csdn.net/a19881029/article/details/8689272

Airship
粉丝 46
博文 1045
码字总数 21161
作品 0
南京
高级程序员
私信 提问
hibernate 关于联合主键

-----------------------------映射文件---------------------------------------------- <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD......

李永china
2016/05/01
43
0
Hibernate联合主键映射规则和数据查询原理

Hibernate联合主键的映射规则: 第一种:主键和属性在一个类中 1.配置文件 注:联合主键的主键配置标签用表示。

长平狐
2012/11/12
1K
0
Java程序员从笨鸟到菜鸟之(六十)细谈Hibernate(十一)hibernate复合主键映射

欢迎阅读本专题其他博客: 细谈Hibernate(六)Hibernate继承关系映射 细谈Hibernate(七)Hibernate自身一对多和多对多 细谈Hibernate(八)Hibernate集合Map关系映射 细谈Hibernate(九)h...

长平狐
2012/11/12
218
1
Hibernate框架学习之注解映射实体类

前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了...

Single_YAM
2017/11/13
0
0
Hibernate(三)——框架中的关系映射

在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而Hibernate时间实体类和数据库中的...

凡尘里的一根葱
2015/11/11
61
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
45分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
123
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部