`

JPA学习(二)—— Domain注解下

阅读更多

关于继承

domain继承的情况不多见,继承主要用于抽出两个实体中相同的部分,其数据库表结构的设计可以有多种方式。

直接通过例子说明好了,现在假设User存在两种:CompanyPerson,其中idnameaddress为公共信息,我们可以抽出一个User类保存。假设CompanyCEOfoundedDateyearIncome等信息,Personagesexbirthincome等信息。现在三个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表示Person3表示Company

         JOINED:相同字段保存在一张表,不同字段单独保存(上例会有三张表),通过表连接查询取得。

         TABLE_PER_CLASS:一个类一张表。一样是三张表,不过子表中会保存全部的列(不推荐)。

@DiscriminatorColumn@DiscriminatorValue:只有在InheritanceTypeSINGLE_TABLE时使用,用于指明区分列和值。

 

修改TestDAO的代码,我们就可以拿出PersonCompany了:

 

如果想看sql,可以在persistence.xml中将Hibernateshow_sql打开,在properties中加入如下属性:

<property name="hibernate.show_sql" value="true"/>

 

其它常用字段注解

大数据类型(Lob类型):包括CLOBBLOB

直接使用@Lob注解,由于大数据的加载可能会影响性能,所以可以懒加载,在@Lob之后使用@Basic(fetch=FetchType.LAZY)即可。

 

瞬时字段:不希望与数据库映射的字段

直接在字段上加上@Transient注解即可。

 

表关联:

使用@ManyToOne@OneToMany@OneToOne@ManyToMany等,很重要,以后详细说。

 

当然,除了注解之外,JPA还可以使用XML进行映射,我个人觉得使用XML还不如单纯的Hibernate效果好,所以就不说了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics