您的位置:首页 > 其它

hibernate基础之查询--一对多关联关系的映射

2011-12-20 14:34 495 查看
今天 在做一对多关联关系的映射的时候有一个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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐