Java学习之道:hibernate联合主键的创建方式
2013-07-31 17:25
363 查看
总结个hibernate联合主键的创建方式,刚看完兵爷的视频,赶紧弄下来。冬爷,赶紧膜拜知道不?我这弄下来是为了明天面试,压力大很知道不?
联合主键,讲一张表中两个属性同时作为主键。
student.java
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;
@Entity
@IdClass(value=StudentPK.class)
public class Student {
//@EmbeddedId
//private StudentPK pk;
@Id
private int id;
@Id
private String name;
// public StudentPK getPk() {
// return pk;
// }
// public void setPk(StudentPK pk) {
// this.pk = pk;
// }
private int age;
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
还有另外一个类专门设立有关主键的两个变量。
studentPK.java
Java代码
package com.hibernate.finalmodel;
import java.io.Serializable;
import javax.persistence.Embeddable;
public class StudentPK implements Serializable {
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;
}
public boolean equals(Object o) {
if(o instanceof StudentPK) {
StudentPK pk = (StudentPK) o;
if(this.id == pk.getId() && this.name.equals(pk.getName()))
return true;
}
return false;
}
public int hashCode() {
return this.name.hashCode();
}
}
这里必须重写equals和hashcode方法。重写hashcode是要定位name属性是否一致,在内存中,hashcode相同的对象线性储存。找到相同的hashcode后,在比较equals,从而得到联合主键的比较结果。
写一个单元测试
TestBase.java
Java代码
package com.hibernate.finaltest;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hibernate.finalmodel.Student;
import com.hibernate.finalmodel.StudentPK;
public class TestBase {
private static SessionFactory sessionFactory = null;
Session session;
@BeforeClass
public static void preMethod() {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
// if(session == null)
// session = sessionFactory.openSession();
// else
// session = sessionFactory.getCurrentSession();
}
@AfterClass
public static void postMethod() {
sessionFactory.close();
}
@Test
public void testMethod() {
System.out.println("start create student");
session = sessionFactory.openSession();
// Student s = new Student();
// s.setAge(23);
// s.setName("samuel");
StudentPK pk = new StudentPK();
pk.setId(1);
pk.setName("Andrew");
Student s = new Student();
//s.setPk(pk);
s.setAge(7);
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
}
[/code
测试成功。
联合主键,讲一张表中两个属性同时作为主键。
student.java
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;
@Entity
@IdClass(value=StudentPK.class)
public class Student {
//@EmbeddedId
//private StudentPK pk;
@Id
private int id;
@Id
private String name;
// public StudentPK getPk() {
// return pk;
// }
// public void setPk(StudentPK pk) {
// this.pk = pk;
// }
private int age;
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
还有另外一个类专门设立有关主键的两个变量。
studentPK.java
Java代码
package com.hibernate.finalmodel;
import java.io.Serializable;
import javax.persistence.Embeddable;
public class StudentPK implements Serializable {
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;
}
public boolean equals(Object o) {
if(o instanceof StudentPK) {
StudentPK pk = (StudentPK) o;
if(this.id == pk.getId() && this.name.equals(pk.getName()))
return true;
}
return false;
}
public int hashCode() {
return this.name.hashCode();
}
}
这里必须重写equals和hashcode方法。重写hashcode是要定位name属性是否一致,在内存中,hashcode相同的对象线性储存。找到相同的hashcode后,在比较equals,从而得到联合主键的比较结果。
写一个单元测试
TestBase.java
Java代码
package com.hibernate.finaltest;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hibernate.finalmodel.Student;
import com.hibernate.finalmodel.StudentPK;
public class TestBase {
private static SessionFactory sessionFactory = null;
Session session;
@BeforeClass
public static void preMethod() {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
// if(session == null)
// session = sessionFactory.openSession();
// else
// session = sessionFactory.getCurrentSession();
}
@AfterClass
public static void postMethod() {
sessionFactory.close();
}
@Test
public void testMethod() {
System.out.println("start create student");
session = sessionFactory.openSession();
// Student s = new Student();
// s.setAge(23);
// s.setName("samuel");
StudentPK pk = new StudentPK();
pk.setId(1);
pk.setName("Andrew");
Student s = new Student();
//s.setPk(pk);
s.setAge(7);
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
}
[/code
测试成功。
相关文章推荐
- java关于hibernate如何基于注解创建联合主键
- Hibernate学习_010_联合主键映射(Annotation方式)
- 【Java语言学习】之创建对象的方式种类
- hibernate使用配置文件创建联合主键往MySQL数据库插入数据
- java学习11--线程创建的两种方式,生命周期以及守护线程
- Java的Hibernate框架中复合主键映射的创建和使用教程
- hibernate联合主键生成机制(annotation方式)
- hibernate3.3.2学习笔记---联合主键
- Hibernate学习_004_Hibernate中常用的主键生成策略总结(下)Annotation方式
- hibernate联合主键生成机制(annotation方式)
- 联合主键用Hibernate注解映射的三种方式
- Hibernate学习_003_Hibernate中常用的主键生成策略总结(上)XML方式
- Hibernate注解映射联合主键的三种主要方式
- hibernate学习:联合主键2
- 并发编程学习总结(一) :java 创建线程的三种方式的优缺点和实例(转载自:http://blog.csdn.net/u011784767/article/details/51315007)
- [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现
- JAVA学习第二十三课(多线程(二))- (多线程的创建方式二 :实现Runnable接口(常用))
- Java多线程学习总结--线程概述及创建线程的方式(1)
- hibernate联合主键 注解方式
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService