近两天来在研究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(); } } }
|