※準備資料
CREATE TABLE INDIVISUAL_FILE( ID NUMBER(5), NAME VARCHAR(10), INTEREST VARCHAR(120), CONSTRAINT PK_INDIVISUAL_FILE PRIMARY KEY(ID) );
※INTEREST設大一個,因為有很多興趣
※UserType
先寫一個class,繼承UserType,總共要覆寫11個方法public class InterestUserType implements UserType { @Override public int[] sqlTypes() { System.out.println("sqlTypes"); return new int[] { Types.VARCHAR }; } @Override public Class<?> returnedClass() { System.out.println("returnedClass"); return List.class; } @Override public boolean equals(Object x, Object y) throws HibernateException { System.out.println("equals"); if (x == null || y == null) { return false; } if (x == y) { return true; } return x.equals(y); } @Override public int hashCode(Object x) throws HibernateException { System.out.println("hashCode"); return x.hashCode(); } /** * 從資料庫取出 */ @Override public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { System.out.println("nullSafeGet"); return this.disassemble(rs.getString(names[0])); } /** * 存到資料庫 */ @Override public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { System.out.println("nullSafeSet"); if (value == null) { st.setNull(index, java.sql.Types.NULL); } else { st.setString(index, this.assemble(null, value).toString()); } } /** * 複製原始資料 */ @SuppressWarnings("unchecked") @Override public Object deepCopy(Object value) throws HibernateException { System.out.println("deepCopy"); if (value == null) { return null; } List<String> newData = new ArrayList<String>(); newData.addAll((List<String>) value); return newData; } /** * 此實體是否可被改變 */ @Override public boolean isMutable() { System.out.println("isMutable"); return true; } /** * 將「,」轉成List */ @Override public Serializable disassemble(Object value) throws HibernateException { System.out.println("disassemble"); List<String> list = new ArrayList<String>(); String comma[] = value.toString().split(","); for (int i = 0; i < comma.length; i++) { list.add(comma[i]); } return (Serializable) list; } /** * 將List轉成「,」的型式 */ @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { System.out.println("assemble"); StringBuffer sb = new StringBuffer(); @SuppressWarnings("unchecked") Iterator<String> it = ((List<String>) owner).iterator(); while (it.hasNext()) { sb.append(it.next()).append(","); } return sb; } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { System.out.println("replace"); return original; } }
※XML設定
IndivisualFile.java
public class IndivisualFile { private Integer id; private String name; private List<String> interest; //setter/getter... }
IndivisualFile.hbm.xml
<class name="vo.IndivisualFile" table="INDIVISUAL_FILE"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="assigned" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="interest" type="vo.InterestUserType"> <column name="INTEREST" /> </property> </class>
※注意interest的type要連到前面寫的InterestUserType
測試類
Session s = HibernateUtil2.getSession(); Transaction tx = s.beginTransaction(); try { IndivisualFile idv = new IndivisualFile(); idv.setId(1); idv.setName("王小明"); idv.setInterest(new ArrayList<String>()); idv.getInterest().add("下棋"); idv.getInterest().add("爬山"); idv.getInterest().add("聽音樂"); s.save(idv); tx.commit(); IndivisualFile rtn = (IndivisualFile) s.get(IndivisualFile.class, 1); System.out.println("id:" + rtn.getId()); System.out.println("name:" + rtn.getName()); System.out.println("size:" + rtn.getInterest().size()); for (String str : rtn.getInterest()) { System.out.println(str); } } catch (Exception e) { System.err.println("例外錯誤!"); e.printStackTrace(); tx.rollback(); } finally { if (s.isOpen()) { s.close(); } }
控制台的執行結果:
sqlTypes
sqlTypes
sqlTypes
isMutable
sqlTypes
sqlTypes
sqlTypes
sqlTypes
deepCopy
equals
Hibernate:
insert
into
INDIVISUAL_FILE
(NAME, INTEREST, ID)
values
(?, ?, ?)
nullSafeSet
assemble
id:1
name:王小明
size:3
下棋
爬山
聽音樂
※而資料庫的INTEREST欄位是:下棋,爬山,聽音樂,
最後有個逗點,但無所謂,取出時大小還是3
※Annotation設定
IndivisualFile.java
@Entity @Table(name = "INDIVISUAL_FILE") public class IndivisualFile { private Integer id; private String name; private List<String> interest; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Type(type = "vo.InterestUserType") public List<String> getInterest() { return interest; } public void setInterest(List<String> interest) { this.interest = interest; } }
沒有留言:
張貼留言