Hibernate對映元件屬性(一)
阿新 • • 發佈:2019-02-03
元件屬性的意思是,持久化類的屬性並不是基本資料型別,也不是字串、日期等標量型別的變數,而是一個複合型別的物件,在持久化過程中,它僅僅被當作值型別,而並非引用另一個持久化實體。元件屬性的型別可以是任何自定義類。看下面實體的原始碼。
@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;
}
}