一、映射普通的组件属性
组件就是一个自定义类型,在持久化类中,如果一个属性的类型不是基本数据类型,那么应该怎么将其映射为数据表呢?
直接看个例子:
@Entity
@Table(name="person")
public class Person {
@Id @Column(name="person_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="person_age")
private int age;
private Name name;
//省略所有setter、getter方法
}
这是一个持久化类,它有一个Name类型的属性,Name是自定义的一个类型,若想对Name组件进行映射,需要用@Embeddable修饰Name类,并用@Column注解修饰其内部的属性(其属性不是集合时),并在Name类中定义一个持久化类的对象并用@Parent修饰,如下:
@Embeddable
public class Name {
@Column(name="person_first")
private String first;
@Column(name="person_last")
private String last;
@Parent
private Person owner;
//省略所有setter、getter方法
//省略无参构造方法、省略first、last两参构造方法
}
二、组件属性为集合
需要参考基本数据类型属性是集合的情况:Hibernate映射集合属性(基本类型)
这种情况下的注解与上节中是相同的,例如:
@Embeddable
public class Name {
@Column(name="person_first")
private String first;
@Column(name="person_last")
private String last;
@Parent
private Person owner;
@ElementCollection(targetClass=Integer.class)
@CollectionTable(name="power_inf",joinColumns=@JoinColumn(name="person_name_id",nullable=false))
@Column(name="name_power",nullable=false)
@MapKeyColumn(name="name_aspect")
@MapKeyClass(String.class)
private Map<String,Integer> power=new HashMap<String, Integer>();
//省略setter、getter以及构造函数
}
可以看到这和上节是一样的。
二、集合的元素是组件
集合为List或Set时:
//对该集合的映射与上一节对集合的注解基本是一致的
//去掉@Column注解就可以了
private List<Name> nicks=new ArrayList<>();
集合为Map时且Map的Key是组件:
//当Map的key为自定义类型时,必须重写Name类的hashCode()和equal()方法
private Map<Name,Integer> nickPower=new HashMap<Name,Integer>();