今天把ssh中hibernate一对多双向实现了下,贴出来分享下,有不足的,请兄弟们指正.
最主要的两个model person(1端) score(多端),一个人可能有多个分数.
package com.fk.model;
import java.util.HashSet;
import java.util.Set;
public class Person {
private int id;
private String name;
private String phone;
private String address;
private Set<Score> scores = new HashSet<Score>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Set<Score> getScores() {
return scores;
}
public void setScores(Set<Score> scores) {
this.scores = scores;
}
}
package com.fk.model;
public class Score {
private int id;
private String scorename;
private int scorevalue;
private Person person;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getScorename() {
return scorename;
}
public void setScorename(String scorename) {
this.scorename = scorename;
}
public int getScorevalue() {
return scorevalue;
}
public void setScorevalue(int scorevalue) {
this.scorevalue = scorevalue;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
两个实体类,关键是 在person中要设置`set集合,集合的类型是Set<Score>,在Score中要设置Person.
首先来讲,为啥要设置双向关联阿,其实单项也ok,不过单项关联,在存储的时候,会发出多条update语句,单项的话,就没有必要在score中设置person了,单项存储的话,流程是这样,先存储score,再创建person对象,然后把set集合设置上.这样会发update语句,更新score表中的外键字段.
维护关系等与在一的一端维护,要存1个person,100条score,发1个insert person,100条insertscore,外加100条update,
如果就发100条insert score 1条person多好,这样就必须用到双向关联了.
person.hbm.xml
<hibernate-mapping>
<class name="com.fk.model.Person" table="t_person">
<id name="id" column="id" type="int">
<generator class="increment" />
</id>
<property name="name" />
<property name="phone" />
<property name="address" />
<set name="scores" inverse="true">
<key column="person_id"></key>
<one-to-many class="com.fk.model.Score"></one-to-many>
</set>
</class>
</hibernate-mapping>
这个注意inverse,说明这个维护关系转到score来搞,不要person搞了,不要发update了
<hibernate-mapping>
<class name="com.fk.model.Score" table="t_score">
<id name="id" column="id" type="int">
<generator class="increment" />
</id>
<property name="scorename" column="scorename" type="string" />
<property name="scorevalue" column="scorevalue" type="int" />
<many-to-one name="person" column="person_id"></many-to-one>
</class>
</hibernate-mapping>
添加了多对一的标签了,name属性填Score中person属性,column中填person_id,外键.
保存时候,先存person,不需要知道person的set集合了,再存score,在存score时,把person设置上,就可以了.