今天 在做一对多关联关系的映射的时候有一个employee对象怎么都差不进去,后来发现是数据库设计时,字段长度为10,而我设置名字(employee.name)是bill_gates2,刚好大于10,所以有以下异常:
Exception in thread "main" org.hibernate.exception.DataException: could not insert: [com.messi.hibernate.domain.Employee]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:77)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at com.messi.hibernate.test.Many2one.add(Many2one.java:37)
at com.messi.hibernate.test.Many2one.main(Many2one.java:12)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3595)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
... 17 more
下面是一对多,多对一的测试类
package com.messi.hibernate.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.messi.hibernate.domain.Department;
import com.messi.hibernate.domain.Employee;
import com.messi.hibernate.utils.HibernateUtils;
public class Many2one {
public static void main(String[] args) {
add();
query(2);
queryDepart(1);
}
static Department add() {
Session s = null;
Transaction tx=null;
try {
Department dpt=new Department();
dpt.setName("ibm");
Employee em=new Employee();
em.setDepart(dpt);
em.setName("bill_gates");
Employee em2=new Employee();
em2.setDepart(dpt);
em2.setName("扎克伯格");
s = HibernateUtils.getSession();
tx=s.beginTransaction();
s.save(dpt);
s.save(em);
s.save(em2);
tx.commit();
} finally {
if (s != null) {
s.close();
}
}
return null;
}
static Employee query(int empid){
Session s=null;
Transaction tx=null;
try {
s=HibernateUtils.getSession();
tx=s.beginTransaction();
Employee e=(Employee) s.get(Employee.class,empid);
System.out.println("department name:"+e.getDepart().getName());
tx.commit();
return e;
}finally{
if(s!=null){
s.close();
}
}
}
static Department queryDepart(int deptid){
Session s=null;
Transaction tx=null;
try {
s=HibernateUtils.getSession();
tx=s.beginTransaction();
Department dp=(Department) s.get(Department.class,deptid);
System.out.println("employee size:"+dp.getEmp().size());
tx.commit();
return dp;
}finally{
if(s!=null){
s.close();
}
}
}
}
下面是配置文件:Employee.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.messi.hibernate.domain">
<class name="Employee">
<id name="id" type="integer">
<generator class="native"></generator>
</id>
<property name="name" length="10" not-null="true"></property>
<many-to-one name="depart" column="depart_id"></many-to-one>
</class>
</hibernate-mapping>
下面是Department.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.messi.hibernate.domain">
<class name="Department">
<id name="id" type="integer">
<generator class="native"></generator>
</id>
<property name="name" length="10" not-null="true"></property>
<set name="emp">
<key column="depart_id"></key>
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>