近兩天來在研究Hibernate中的one-to-one和one-to-many的問題,做了很多試驗,發現實現表關系時,在hibernate-mapping中generator的class設為uuid.hex,上述的兩種關系可以實現,也就是數據庫的主鍵設為varchar(MSSQL2000),但是主鍵改成int型的標識卻彈出“ERROR SessionImpl:2379 - Could not synchronize database state with session”和“net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row not found)”異常,百思不得其解。下面貼出主鍵設為uuid.hex時的實現代碼:
Child.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping> ??? <class name="test.pojo.Child" table="child"> ??????? <id name="cid" column="cid" > ??????????? <generator class="uuid.hex"/> ??????? </id> ??????? <property name="cname" column="cname" /> ??????? <many-to-one name="parent" column="pid" /> ??? </class> </hibernate-mapping>
Child.java
package test.pojo;
public class Child { ??? private String cname; ??? private String pid; ??? private Parent parent; ??? private String cid; ??? public Child() { ??? }
??? public String getCid() { ??????? return cid; ??? }
??? public void setCid(String cid) { ??????? this.cid = cid; ??? }
??? public String getCname() { ??????? return cname; ??? }
??? public void setCname(String cname) { ??????? this.cname = cname; ??? }
??? public String getPid() { ??????? return pid; ??? }
??? public void setPid(String pid) { ??????? this.pid = pid; ??? }
??? public Parent getParent() { ??????? return parent; ??? }
??? public void setParent(Parent parent) { ??????? this.parent = parent; ??? } }
Parent.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping> ??? <class name="test.pojo.Parent" table="parent" > ??????? <id name="pid" column="pid" type="integer"> ??????????? <generator class="uuid.hex" /> ??????? </id> ??????? <property name="pname" column="pname" /> ??????? <set name="child" lazy="true" inverse="true" cascade="all"> ??????????? <key column="cid" /> ??????????? <one-to-many class="capinfo.negroup.test.pojo.Child"/> ??????? </set> ??? </class> </hibernate-mapping>
Parent.java package test.pojo;
import java.util.HashSet;
public class Parent { ??? private String pname; ??? private java.util.Set child = new HashSet(); ??? private String pid; ??? public Parent() { ??? }
??? public String getPid() { ??????? return pid; ??? }
??? public void setPid(String pid) { ??????? this.pid = pid; ??? }
??? public String getPname() { ??????? return pname; ??? }
??? public void setPname(String pname) { ??????? this.pname = pname; ??? }
??? public java.util.Set getChild() { ??????? return child; ??? }
??? public void setChild(java.util.Set child) { ??????? this.child = child; ??? }
}
TestHibernate.java package test.pojo;
public class TestHibernate { ??? public TestHibernate() { ??? }
??? public static void main(String[] argv) { ??????? //先建立多的初始數據 ??????? Child child = new Child(); ??????? child.setCname("kerry"); ??????? //再建立一的初始數據 ??????? Parent parent = new Parent(); ??????? parent.setPname("Kelphen"); ??????? //將多的數據放入到一里 ??????? parent.getChild().add(child); ??????? //再將一放到多里,這樣一與多互相擁有對方 ??????? child.setParent(parent); ??????? try { ??????????? BaseDAOHibernate.saveObject(parent); ??????? } ??????? catch (DAOException daoe) { ??????????? daoe.printStackTrace(); ??????? } ??? } }
|