天天看點

JPA學習(二)—— Domain注解下

關于繼承

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