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