`

Hibernate级联cascade 完整实例 及 错误解决(mysql)

阅读更多

最近在学习Hibernate(基于《深入浅出Hibernate》一书),在动手练习的时候,出现了一些问题,并加以解决,现将其罗列如下:

 

数据库表创建:

 

CREATE TABLE `t_user` (    
  `id` int(11) NOT NULL AUTO_INCREMENT,    
  `name` varchar(45) default NULL,    
  `age` int(3) default NULL,    
  `group_id` int(11) default NULL,    
  PRIMARY KEY  (`id`)    
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 

 

CREATE TABLE `t_passport` (      
  `id` int(11) NOT NULL ,      
  `serial` varchar(30) default NULL,      
  `expiry` int(11) default NULL,         
  PRIMARY KEY  (`id`)      
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
 

 

 

配置文件:

 

<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
			    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>	

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
	  <property name="url" value="jdbc:mysql://localhost:3306/test" />
	  <property name="username" value="root" />
	  <property name="password" value="123" />
	  <property name="maxActive" value="64"/>
	  <property name="maxIdle" value="2" />
	  <property name="maxWait" value="10" />
	 <!--  <property name="validationQuery" value="select sysdate from dual" /> -->
	  <property name="testWhileIdle" value="true" />
	  <property name="timeBetweenEvictionRunsMillis" value="60000" />
	  <property name="minEvictableIdleTimeMillis" value="60000" />
	  <property name="removeAbandoned" value="true" />
</bean>

	<bean id="mySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
        <property name="dataSource"><ref local="myDataSource"/></property>
		<property name="mappingResources">
			<list>
			<!-- 	<value>com/chinabank/b2c/hbm/Person.hbm.xml</value>
				<value>com/chinabank/b2c/hbm/Address.hbm.xml</value> -->
				<value>com/chinabank/b2c/hbm/TUser.hbm.xml</value>
				<value>com/chinabank/b2c/hbm/TPassport.hbm.xml</value>
			</list>
		</property>
		
		<property name="hibernateProperties">
			<props>
				<!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>-->
				<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
				<prop key="hibernate.proxool.existing_pool">true</prop>
				<prop key="hibernate.proxool.pool_alias">test</prop>
				<prop key="hibernate.jdbc.batch_size">0</prop>	 
			</props>
		</property>		
	</bean>
	

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) 	-->
	<bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
		<property name="sessionFactory"><ref local="mySessionFactory"/></property>
	<!-- 	<property name="dataSource"><ref local="myDataSource"/></property> -->
	</bean>

</beans>

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
	<class name="com.chinabank.b2c.hbm.TUser" table="t_user">
		<id name="id" column="id" type="java.lang.Integer">
			<generator class="native"><!--assigned native-->
			</generator>
		</id>
		
		<property name="name" type="java.lang.String" column="name">
		</property>
		<property name="age" type="java.lang.Integer" column="age">
		</property>
		<!--  -->
		<one-to-one name="passport" class="com.chinabank.b2c.hbm.TPassport"
			cascade="all" outer-join="true">
		</one-to-one>
	</class>
</hibernate-mapping>
 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
	<class name="com.chinabank.b2c.hbm.TPassport" table="t_passport">
		<id name="id" column="id" type="java.lang.Integer">
			<generator class="foreign">
				<param name="property">user</param>
			</generator>
		</id>
		
		<property name="serial" type="java.lang.String" column="serial">
		</property>
		<property name="expiry" type="java.lang.Integer" column="expiry">
		</property>
		
		<one-to-one name="user" class="com.chinabank.b2c.hbm.TUser"
			constrained="true">
		</one-to-one>
	</class>
</hibernate-mapping>

 

 

javabean定义

 

 

package com.chinabank.b2c.hbm;

import java.io.Serializable;

public class TUser implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1523232529237055567L;
	public TUser(){
		
	}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public TPassport getPassport() {
		return passport;
	}
	public void setPassport(TPassport passport) {
		this.passport = passport;
	}
	private Integer id;
	private Integer age;
	private String name;
	private TPassport passport;

}
 

 

 

package com.chinabank.b2c.hbm;

import java.io.Serializable;

public class TPassport implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7458971855517828094L;
	
	public TPassport(){
		
	}
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getSerial() {
		return serial;
	}

	public void setSerial(String serial) {
		this.serial = serial;
	}

	public Integer getExpiry() {
		return expiry;
	}

	public void setExpiry(Integer expiry) {
		this.expiry = expiry;
	}

	public TUser getUser() {
		return user;
	}

	public void setUser(TUser user) {
		this.user = user;
	}
	private Integer id;
	private String serial;
	private Integer expiry;
	private TUser user;
	
	public String toString(){
		return  this.serial+this.id+this.expiry+user.toString();
		
	}

}
 

 

 

public void cascadeT(){
		ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
		HibernateTransactionManager manager = (HibernateTransactionManager) context.getBean("myTransactionManager");
		try {
			Session session = manager.getSessionFactory().openSession();
			TUser user = new TUser();
			user.setAge(new Integer(20));
			user.setName("Carin");

			TPassport passport = new TPassport();
			passport.setSerial("PCN759386");
			passport.setExpiry(new Integer(20150101));

			// 设置关联
			passport.setUser(user);
			user.setPassport(passport);
			Transaction tx = session.beginTransaction();
			session.save(user);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		
	}
 

 

 

以上是最终代码。在此之前,曾遇到过这样几个问题:

 

错误1.hibernate方言适配器配置不对。

 

2012-5-22 3:22:12 net.sf.hibernate.id.TableGenerator generate
严重: could not read a hi value
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'test.hibernate_unique_key' doesn't exist

 

错:<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
对:<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>

 

 

错误2. 主键没有设置为自动增长

 

警告: SQL Error: 1364, SQLState: HY000
2012-5-22 3:27:05 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
严重: Field 'id' doesn't have a default value
net.sf.hibernate.exception.GenericJDBCException: could not insert: [com.chinabank.b2c.hbm.TUser]

 

`id` int(11) NOT NULL 之后加上 AUTO_INCREMENT 即:`id` int(11) NOT NULL  AUTO_INCREMENT

 

错误3. 错误的添加外键,画蛇添足

 

警告: SQL Error: 1452, SQLState: 23000
2012-5-22 3:34:40 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
严重: Cannot add or update a child row: a foreign key constraint fails (`test`.`t_user`, CONSTRAINT `fk1` FOREIGN KEY (`id`) REFERENCES `t_passport` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
net.sf.hibernate.exception.GenericJDBCException: could not insert: [com.chinabank.b2c.hbm.TUser]
 

 

去掉外键
分享到:
评论

相关推荐

    hibernate小白极简实例

    以上内容涵盖了Hibernate的基本操作,通过这个极简实例,你可以在Java项目中实现对Mysql数据库的增删查改。继续深入学习,你将能掌握更复杂的映射和高级特性,如缓存、性能优化等。在实践中不断尝试和理解,将有助于...

    hibernate 入门经典实例

    ### Hibernate入门经典实例详解 #### 实验一:Hibernate开发框架搭建 **实验目的:** - 理解并掌握如何使用Hibernate进行持久层开发; - 了解三层架构的意义:业务逻辑层、数据持久层和数据库。 **技术要点:** ...

    hibernate实例

    **hibernate实例详解** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本实例将带你深入理解Hibernate的基本用法,通过一个简单的"一对一"(OneToOne)关系映射的...

    Hibernate Soruce Code 源代码

    8. 高级特性:包括懒加载(Lazy Loading)、级联操作(Cascade)、事务管理、事件监听器、状态转换等。 9. 深入源码学习的价值:了解Hibernate如何执行SQL、如何处理缓存、事务控制机制等,有助于解决实际开发中的...

    hibernate所需驱动

    10. ** CascadeType 和 FetchType**:在映射文件中,可以设置Cascade属性来决定操作一个实体时是否级联到关联实体,FetchType则决定了关联数据是在需要时懒加载还是立即加载。 通过理解并熟练应用这些知识点,...

    Hibernate学习笔记

    Hibernate还提供了许多高级特性,如懒加载(LazyInitialization)、级联操作(Cascade)、事务管理、乐观锁和悲观锁等,这些特性进一步增强了框架的功能性和灵活性,使得开发者能够更加高效、安全地管理数据。...

    精通hibernate

    Hibernate,作为Java领域中最流行的持久化框架之一,它为开发者提供了方便快捷的对象关系映射(ORM)解决方案,极大地简化了数据库操作。本指南将深入探讨Hibernate的核心概念、主要功能及其实际应用场景,旨在帮助...

    Hibernate Annotation入门

    在实际开发中,你还可以探索更多高级特性,如懒加载(Lazy Loading)、级联操作(Cascade)、查询注解(@NamedQuery、@Query)等。对于源码和工具的深入理解,可以进一步提高开发效率和代码质量。例如,了解...

    Hibernate 的学习笔记

    - **概念**:Hibernate 是一种“对象/关系映射”(Object/Relational Mapping,简称 ORM)技术,用于解决 Java 应用程序与关系型数据库交互的问题。 - **作用**:通过 ORM 技术,Hibernate 能够在 Java 对象模型与...

    Hibernate数据关联技术_1vs1应用案例_笔记

    总结,本笔记提供的案例展示了如何在Hibernate中实现一对一关联,并结合Struts框架构建完整的Web应用程序,涵盖了从数据库设计、实体类映射到前后端交互的全过程,对于理解和运用Hibernate的1:1关联技术具有很好的...

    hibernate配置文件

    - **`connection.url`**: 数据库连接URL,包括主机名、端口号及实例名。 - **`dialect`**: 指定Hibernate使用的Oracle方言。 - **`connection.password`**: Oracle数据库密码。 - **`connection.driver_class`**: ...

    hibernate中many2many映射

    以上就是使用Hibernate进行Many-to-Many映射的完整流程。通过这种方式,我们可以方便地管理和维护两个实体之间的复杂关联,同时利用Hibernate自动处理中间表的创建和操作。在实际项目中,还可以根据需求调整映射策略...

    整理的Hibernate

    4. **级联操作(Cascade)**:`cascade="delete"`表示当删除`Dept`时,所有关联的`Emp`也会被删除。`delete-orphan`则会在删除集合中的某个元素时,将其从数据库中移除,防止孤儿记录。 5. **一对多关系映射**: -...

    框架开发hibernate

    3. **安装MySQL或其它数据库**:为了演示Hibernate如何与数据库交互,你需要安装一个数据库管理系统,如MySQL。安装完成后,创建一个数据库用于测试,并确保能够通过SQL命令行工具连接该数据库。 4. **下载...

    hibernate-note学习笔记

    - **级联删除**(cascade delete): 删除一个对象时,同时删除其关联对象。 #### 六、并发控制 - **悲观锁**: 在操作数据前加锁,直到操作完成后再释放锁。 - **乐观锁**: 不直接锁定数据,在提交更改前检查数据是否...

    Hibernate学习

    - **Inverse和cascade区别**:inverse控制哪一方负责关联的维护,而cascade控制关联对象的操作是否级联。 - **一对多双向关联映射总结**:总结一对多双向关联的特点及其应用场景。 #### 多对多关联映射单向(many-...

    HIbernate注解详解(二)

    在映射这些关系时,需要考虑懒加载(`fetch = FetchType.LAZY`)和级联操作(`cascade = CascadeType.ALL`)的配置。 此外,`@Temporal(TemporalType.TIMESTAMP)`用于处理日期和时间类型,`@Lob`用于大对象(LOB)...

    java 资料

    #### Hibernate cascade取值详解 - **Cascade Save-Update**: 当父对象被保存或更新时,其关联的所有子对象也将被保存或更新。 - **Cascade Delete**: 删除父对象时,所有关联的子对象也将被删除。 - **Cascade All-...

Global site tag (gtag.js) - Google Analytics