1. 程式人生 > >Hibernate對映元件屬性(一)

Hibernate對映元件屬性(一)

元件屬性的意思是,持久化類的屬性並不是基本資料型別,也不是字串、日期等標量型別的變數,而是一個複合型別的物件,在持久化過程中,它僅僅被當作值型別,而並非引用另一個持久化實體。元件屬性的型別可以是任何自定義類。看下面實體的原始碼。

 @Entity
@Table(name="person_inf")
public class Person
{
	@Id @Column(name="person_id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	private int age;
	// 元件屬性name
	private Name name;

	// id的setter和getter方法
	public void setId(Integer id)
	{
		this.id = id;
	}
	public Integer getId()
	{
		return this.id;
	}

	// age的setter和getter方法
	public void setAge(int age)
	{
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}

	// name的setter和getter方法
	public void setName(Name name)
	{
		this.name = name;
	}
	public Name getName()
	{
		return this.name;
	}
}

上面的自定義類:Name,不能用@Column註解來修飾,需要在自定義的類Name中用@Embeddable來修飾。如下的程式。

@Embeddable
public class Name
{
	// 定義first成員變數
	@Column(name="person_firstname")
	private String first;
	// 定義last成員變數
	@Column(name="person_lastname")
	private String last;
	// 引用擁有該Name的Person物件
	@Parent      // ①
	private Person owner;

	// 無引數的構造器
	public Name()
	{
	}
	// 初始化全部成員變數的構造器
	public Name(String first , String last)
	{
		this.first = first;
		this.last = last;
	}

	// first的setter和getter方法
	public void setFirst(String first)
	{
		this.first = first;
	}
	public String getFirst()
	{
		return this.first;
	}

	// last的setter和getter方法
	public void setLast(String last)
	{
		this.last = last;
	}
	public String getLast()
	{
		return this.last;
	}

	// owner的setter和getter方法
	public void setOwner(Person owner)
	{
		this.owner = owner;
	}
	public Person getOwner()
	{
		return this.owner;
	}

}

上面的程式,同樣可以用@Column來修飾資料列。除此之外,上面的Name類中包含了一個owner,該owner屬性指向包含該Name屬性的實體(也就是Person物件)。為了告訴Hibernate這個Hibernate這個owner屬性不是普通屬性,而是包含Name元件的Person實體,可使用Hibernate本身提供的@Parent注修飾該屬性。使用如下的程式執行。

public class PersonManager
{
	public static void main(String[] args)
	{
		PersonManager mgr = new PersonManager();
		mgr.createAndStorePerson();
		HibernateUtil.sessionFactory.close();
	}

	private void createAndStorePerson()
	{
		Session session = HibernateUtil.currentSession();
		Transaction tx = session.beginTransaction();
		// 建立Person物件
		Person person = new Person();
		// 為Person物件設定屬性
		person.setAge(29);
		// 設定元件屬性
		person.setName(new Name("owen.org" , "Hibernate"));
		session.save(person);
		tx.commit();
		HibernateUtil.closeSession();
	}
}



如果需要為元件屬性所包含的子屬性指定列名,則可使用@AttributeOverrides和@AttributeOverride註解,其中,@AttributeOverride中要指定name和column的屬性。像上面的Person的實體類也可寫成下面的。其結果都是一樣的。

@Entity
@Table(name="person_inf")
public class Person
{
	@Id @Column(name="person_id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	private int age;
	// 元件屬性name
	@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="first", column = @Column(name="person_firstname")),
		@AttributeOverride(name="last", column = @Column(name="person_lastname"))
	})
	private Name name;

	// id的setter和getter方法
	public void setId(Integer id)
	{
		this.id = id;
	}
	public Integer getId()
	{
		return this.id;
	}

	// age的setter和getter方法
	public void setAge(int age)
	{
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}

	// name的setter和getter方法
	public void setName(Name name)
	{
		this.name = name;
	}
	public Name getName()
	{
		return this.name;
	}
}