映射
1.简单注解
2.映射属性
3.映射主键
4.Hibernate主键生成策略
5.映射集合属性
(1)两种集合属性:①List、Set或数组等集合属性;
②Map集合属性;
(2)Hibernate要求持久化集合值字段必须声明为接口,因为Hibernate在持久化某个实例时,会把程序中的集合实现类自动替换成Hibernate自己的集合实现类,因此不要试图把Hibernate集合属性强制类型转换为集合实现类,但可以转换为Set、Map因为Hibernate自己的集合类也实现了Set、Map;
(3)当持久化对象被保存时,这些集合属性会被自动持久化;当持久化对象被删除时,这些集合属性对应的记录将被自动删除。假设集合元素被从一个持久化对象传递到另一个持久化对象,该集合元素对应的记录会从一个表转移到另一个表;
(4)两个持久化对象不能共享一个集合元素的引用;
(5)List集合属性示例:
import java.util.ArrayList; import java.util.List; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OrderColumn; import javax.persistence.Table; @Entity @Table(name="person_inf_1") public class Person { @Id @Column(name="person_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String name; private Integer age; //集合属性,保留该对象关联的学校 @ElementCollection(targetClass=String.class) //指定该集合中元素类型为String //映射保存集合属性的表 @CollectionTable(name="school_inf_1", //指定表名 joinColumns=@JoinColumn(name="person_id",nullable=false) //指定外键列对应此表的person_id列 ) //指定保存集合元素的列为school_name @Column(name="school_name") //集合元素的索引列 @OrderColumn(name="list_order") private List<String> schools = new ArrayList<>(); //setter、getter方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List<String> getSchools() { return schools; } public void setSchools(List<String> schools) { this.schools = schools; } }
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class Test { public static void main(String[] args) { //创建Configuration实例 Configuration cfg = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build(); //以Configuration创建SessionFactory SessionFactory sf = cfg.buildSessionFactory(serviceRegistry); //创建Session Session session = sf.openSession(); //打开事务 Transaction transaction = session.beginTransaction(); //创建Person对象 Person person = new Person(); //设置属性 person.setAge(18); person.setName("name_1"); //向Person的schools属性中添加两个元素 person.getSchools().add("小学"); person.getSchools().add("中学"); session.save(person); transaction.commit(); session.close(); sf.close(); } }
(6)数组属性示例:
import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OrderColumn; import javax.persistence.Table; @Entity @Table(name="person_inf_2") public class Person1 { @Id @Column(name="person_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String name; private Integer age; @ElementCollection(targetClass=String.class) @CollectionTable(name="school_inf_2", joinColumns=@JoinColumn(name="person_id",nullable=false) ) @OrderColumn(name="array_order") private String[] schools; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String[] getSchools() { return schools; } public void setSchools(String[] schools) { this.schools = schools; } }
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class Test1 { public static void main(String[] args) { Configuration conf = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(conf.getProperties()).build(); SessionFactory sf = conf.buildSessionFactory(serviceRegistry); Session session = sf.openSession(); Transaction transaction = session.beginTransaction(); Person1 person = new Person1(); person.setAge(18); person.setName("name_1"); String[] schools = {"小学","中学","大学"}; person.setSchools(schools); session.save(person); transaction.commit(); session.close(); sf.close(); } }
(7)Set集合属性示例:
@Entity @Table(name="person_inf_3") public class Person2 { @Id @Column(name="person_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String name; private Integer age; @ElementCollection(targetClass=String.class) @CollectionTable(name="school_inf_3", joinColumns=@JoinColumn(name="person_id",nullable=false) ) @Column(name="school_name") private Set<String> schools = new HashSet<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Set<String> getSchools() { return schools; } public void setSchools(Set<String> schools) { this.schools = schools; } }
public class Test2 { public static void main(String[] args) { Configuration conf = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(conf.getProperties()).build(); SessionFactory sessionFactory = conf.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession(); Transaction t = session.beginTransaction(); Person2 person = new Person2(); person.setAge(18); person.setName("test"); person.getSchools().add("小学"); person.getSchools().add("中学"); session.save(person); t.commit(); session.close(); sessionFactory.close(); } }
(8)Map集合属性示例:
@Entity @Table(name="person_inf_4") public class Person3 { @Id @Column(name="person_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String name; private Integer age; //集合属性,关联考试成绩 @ElementCollection(targetClass=Float.class) @CollectionTable(name="scores_inf", joinColumns=@JoinColumn(name="person_id",nullable=false) ) @MapKeyColumn(name="subject_name") @MapKeyClass(String.class) @Column(name="mark") private Map<String,Float> scores = new HashMap<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Map<String, Float> getScores() { return scores; } public void setScores(Map<String, Float> scores) { this.scores = scores; } }
public class Test3 { public static void main(String[] args) { Configuration conf = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(conf.getProperties()).build(); SessionFactory sessionFactory = conf.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession(); Transaction t = session.beginTransaction(); Person3 person = new Person3(); person.setName("test"); person.setAge(18); person.getScores().put("java", 100.0f); person.getScores().put("jsp", 100.0f); session.save(person); t.commit(); session.close(); sessionFactory.close(); } }
6.集合属性的性能分析
7.有序集合映射
8.映射数据库对象