※準備資料
CREATE TABLE SCHOOL_USER( ID NUMBER(10) NOT NULL, UNAME VARCHAR(10) NOT NULL, SEX VARCHAR(1), CONSTRAINT PK_ID_UNAME PRIMARY KEY(ID, UNAME) ); COMMENT ON TABLE SCHOOL_USER IS '使用者'; COMMENT ON COLUMN SCHOOL_USER.ID IS '使用者id'; COMMENT ON COLUMN SCHOOL_USER.NAME IS '使用者名稱'; COMMENT ON COLUMN SCHOOL_USER.SEX IS '性別';
※使用ID和NAME為複合主鍵
※XML設定
UserPK.java
public class UserPK implements Serializable { private Integer uid; private String uname; //setter/getter... }
※一定要implements Serializable,不然執行時會出「org.hibernate.MappingException: composite-id class must implement Serializable: vo.UserPK」的錯
User.java
private UserPK xxx; private String sex; //setter/getter...
User.hbm.xml
<class name="vo.User" table="SCHOOL_USER"> <composite-id name="xxx" class="vo.UserPK"> <key-property name="uid" type="java.lang.Integer"> <column name="ID" /> </key-property> <key-property name="uname" type="java.lang.String"> <column name="NAME" /> </key-property> <generator class="assigned" /> </composite-id> <property name="sex" type="java.lang.String"> <column name="SEX" /> </property> </class>
※我資料庫的表本來想取名為USER,欄位叫UID,但這兩個剛好是Oracle的關鍵字,雖然聽說可用「"」的方式,但為了保險起見,還是算了,所以我在hbm.xml做轉換的動作
※generator必需在composite-id的最下面
測試類
Session s = HibernateUtil2.getSession(); Transaction tx = s.beginTransaction(); try { UserPK pk = new UserPK(); User u = new User(); pk.setUid(1); pk.setUname("one"); u.setXxx(pk); u.setSex("M"); s.save(u); tx.commit(); UserPK pk2 = new UserPK(); pk2.setUid(1); pk2.setUname("one"); User u2 = (User) s.load(User.class, pk2); System.out.println(u2.getXxx().getUid() + "||" + u2.getXxx().getUname()); } catch (Exception e) { tx.rollback(); System.err.println("例外錯誤!"); e.printStackTrace(); } finally { if (s.isOpen()) { s.close(); } }
※Annotation設定
記得要在hibernate.cfg.xml增加mapping classUserPK.java
@Embeddable public class UserPK implements Serializable { //... }
※PK類只要在類別設定即可
User.java
@Entity @Table(name = "SCHOOL_USER") public class User { private UserPK xxx; private String sex; @EmbeddedId @AttributeOverrides({ @AttributeOverride(name = "uid", column = @Column(name = "ID", nullable = false, length = 10)), @AttributeOverride(name = "uname", column = @Column(name = "NAME", nullable = false, length = 10)) }) public UserPK getXxx() { return xxx; } public void setXxx(UserPK xxx) { this.xxx = xxx; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
※注意是@EmbeddedId哦!
※在@AttributeOverride設定對應關係,當然和之前一樣,Column和類別名稱一樣可不打,只留@EmbeddedId即可
沒有留言:
張貼留言