博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate映射联合主键(详细)
阅读量:6872 次
发布时间:2019-06-26

本文共 6656 字,大约阅读时间需要 22 分钟。

hot3.png

建表语句为:

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:

配置文件hibernate.cfg.xml:

org.hibernate.dialect.MySQLDialect
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/mydb
root
196428
50

  

类:

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

 

转载于:https://my.oschina.net/airship/blog/831405

你可能感兴趣的文章
开启服务器Mcrypt.so加密库的方法
查看>>
如何将SWT程序移植到Applet
查看>>
去好店,一个人在城市里面发生的故事
查看>>
点在面内(2)
查看>>
SPRING注解发布RMI/HTTPInvoker/Hessian/Burlap服务
查看>>
Jmeter(一)-精简测试脚本
查看>>
PowerDesigner显示Comment注释
查看>>
Learn Python the Hard Way: 类(Class)和对象(Object)
查看>>
centos安装或修复grub并使用grub引导系统
查看>>
ThinkPHP 上传文件方法
查看>>
Linux 系统 网卡RTL8723BE 信号差不稳定的解决办法
查看>>
getopt, optarg, optind, opterr, optopt
查看>>
为什么你这么努力,工作却还是没有起色?
查看>>
今天看了thinkcmf 和onethink
查看>>
root运行google chrome
查看>>
SSH部署到Tomcat内存溢出-OutOfMemoryError 的解决办法
查看>>
Android Studio SDK报错,所有方法均红色警告,但可正常编译运行
查看>>
VC使用ADO连接SQLServer数据库
查看>>
JS获取文字长度
查看>>
spring-core组件详解——PropertySource属性源
查看>>