四、映射

映射

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.映射数据库对象

posted @ 2017-08-03 16:41  丶theDawn  阅读(136)  评论(0编辑  收藏  举报