關于繼承
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效果好,是以就不說了。