关于继承
domain继承的情况不多见,继承主要用于抽出两个实体中相同的部分,其数据库表结构的设计可以有多种方式。
直接通过例子说明好了,现在假设User存在两种:Company和Person,其中id、name、address为公共信息,我们可以抽出一个User类保存。假设Company有CEO、foundedDate、yearIncome等信息,Person有age、sex、birth、income等信息。现在三个domain object类信息如下:
User:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "UserType", discriminatorType = DiscriminatorType.INTEGER, length = 1)
@DiscriminatorValue(value = "1")
public class User implements Serializable {
private static final long serialVersionUID = -4969930054771554775L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "ID")
private int id;
@Column(name = "Name", length = 50)
private String name;
@Column(name = "Address")
private String address;
// getter and setter methods
}
Company:
@Entity
@DiscriminatorValue(value = "3")
public class Company extends User implements Serializable {
private static final long serialVersionUID = -4969930054771554775L;
@Column(name = "CEO")
private char ceo;
@Column(name = "FoundedDate")
@Temporal(TemporalType.DATE)
private Date foundedDate;
@Column(name = "YearIncome")
private BigDecimal yearIncome;
// getter and setter methods
}
Person:
@Entity
@DiscriminatorValue(value = "2")
public class Person extends User implements Serializable {
private static final long serialVersionUID = -4969930054771554775L;
@Column(name = "Age")
private int age;
@Column(name = "Sex", length = 1)
private char sex;
@Column(name = "Birth")
@Temporal(TemporalType.DATE)
private Date birth;
@Column(name = "Income")
private BigDecimal income;
// getter and setter methods
}
数据库表结构就不贴出来了,只要有一张User表,并且所有的列都含有就可以了(注意要有一个int型的UserType列)。
下面对新注解进行下说明:
@Inheritance:标明此实体为一个父类,其数据库映射策略有3种
SINGLE_TABLE:一张表储存(常用),其子类根据@DiscriminatorColumn指定的列和@DiscriminatorValue的值进行区分。如上例中,User表中UserType列的值为2表示Person,3表示Company。
JOINED:相同字段保存在一张表,不同字段单独保存(上例会有三张表),通过表连接查询取得。
TABLE_PER_CLASS:一个类一张表。一样是三张表,不过子表中会保存全部的列(不推荐)。
@DiscriminatorColumn和@DiscriminatorValue:只有在InheritanceType为SINGLE_TABLE时使用,用于指明区分列和值。
修改TestDAO的代码,我们就可以拿出Person和Company了:
如果想看sql,可以在persistence.xml中将Hibernate的show_sql打开,在properties中加入如下属性:
<property name="hibernate.show_sql" value="true"/>
其它常用字段注解
大数据类型(Lob类型):包括CLOB,BLOB等
直接使用@Lob注解,由于大数据的加载可能会影响性能,所以可以懒加载,在@Lob之后使用@Basic(fetch=FetchType.LAZY)即可。
瞬时字段:不希望与数据库映射的字段
直接在字段上加上@Transient注解即可。
表关联:
使用@ManyToOne、@OneToMany、@OneToOne、@ManyToMany等,很重要,以后详细说。
当然,除了注解之外,JPA还可以使用XML进行映射,我个人觉得使用XML还不如单纯的Hibernate效果好,所以就不说了。