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>
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>
相关文章推荐
- (转)Hibernate框架基础——一对多关联关系映射
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及添加、查询
- Hibernate框架基础——一对多关联关系映射
- (转)Hibernate框架基础——多对多关联关系映射
- Hibernate 关联映射 之 一对多单项关联 (三)查询
- Hibernate_映射_关联关系_一对一映射1__映射基础
- Hibernate的关联关系注解映射(一对一、一对多、多对一、多对多、自连接) 标签: hibernateentity 2016-10-11 16:28 1635人阅读 评论(0) 收藏 举报 分类
- Hibernate中用left join(左外连接)查询映射中没有关联关系的两个表记录问题
- Hibernate关联关系映射(单向一对多、单向多对一、双向一对多)
- Hibernate框架基础——多对多关联关系映射
- Hibernate的关联关系注解映射(一对一、一对多、多对一、多对多、自连接)
- hibernate 关联映射:多对一(一对多)双向关联关系
- Hibernate关联关系映射配置(一对多,多对多,一对一)
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
- ssh学习之旅(2)--关于hibernate实体映射关联关系映射查询的解决方案-lazy属性惹的祸
- 框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)
- JAVAWEB开发之Hibernate详解(二)——Hibernate的持久化类状态与转换、以及一级缓存详解、关联关系的映射(一对多、多对多、级联)
- Hibernate关联关系映射 一对一 一对多 多对一
- Hibernate_4_部门与员工实例_一对多、多对一关联关系