Hibernate映射组件属性

一、映射普通的组件属性

组件就是一个自定义类型,在持久化类中,如果一个属性的类型不是基本数据类型,那么应该怎么将其映射为数据表呢?
直接看个例子:

@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 power=new HashMap();

    //省略setter、getter以及构造函数
}

可以看到这和上节是一样的。

二、集合的元素是组件

集合为List或Set时:

//对该集合的映射与上一节对集合的注解基本是一致的
//去掉@Column注解就可以了
private List nicks=new ArrayList<>();

集合为Map时且Map的Key是组件:

//当Map的key为自定义类型时,必须重写Name类的hashCode()和equal()方法
private Map<Name,Integer> nickPower=new HashMap<Name,Integer>();

你可能感兴趣的:(Java,web,hibernate)