最近在学习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的基本操作,通过这个极简实例,你可以在Java项目中实现对Mysql数据库的增删查改。继续深入学习,你将能掌握更复杂的映射和高级特性,如缓存、性能优化等。在实践中不断尝试和理解,将有助于...
### Hibernate入门经典实例详解 #### 实验一:Hibernate开发框架搭建 **实验目的:** - 理解并掌握如何使用Hibernate进行持久层开发; - 了解三层架构的意义:业务逻辑层、数据持久层和数据库。 **技术要点:** ...
**hibernate实例详解** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本实例将带你深入理解Hibernate的基本用法,通过一个简单的"一对一"(OneToOne)关系映射的...
8. 高级特性:包括懒加载(Lazy Loading)、级联操作(Cascade)、事务管理、事件监听器、状态转换等。 9. 深入源码学习的价值:了解Hibernate如何执行SQL、如何处理缓存、事务控制机制等,有助于解决实际开发中的...
10. ** CascadeType 和 FetchType**:在映射文件中,可以设置Cascade属性来决定操作一个实体时是否级联到关联实体,FetchType则决定了关联数据是在需要时懒加载还是立即加载。 通过理解并熟练应用这些知识点,...
Hibernate,作为Java领域中最流行的持久化框架之一,它为开发者提供了方便快捷的对象关系映射(ORM)解决方案,极大地简化了数据库操作。本指南将深入探讨Hibernate的核心概念、主要功能及其实际应用场景,旨在帮助...
在实际开发中,你还可以探索更多高级特性,如懒加载(Lazy Loading)、级联操作(Cascade)、查询注解(@NamedQuery、@Query)等。对于源码和工具的深入理解,可以进一步提高开发效率和代码质量。例如,了解...
- **概念**:Hibernate 是一种“对象/关系映射”(Object/Relational Mapping,简称 ORM)技术,用于解决 Java 应用程序与关系型数据库交互的问题。 - **作用**:通过 ORM 技术,Hibernate 能够在 Java 对象模型与...
总结,本笔记提供的案例展示了如何在Hibernate中实现一对一关联,并结合Struts框架构建完整的Web应用程序,涵盖了从数据库设计、实体类映射到前后端交互的全过程,对于理解和运用Hibernate的1:1关联技术具有很好的...
- **`connection.url`**: 数据库连接URL,包括主机名、端口号及实例名。 - **`dialect`**: 指定Hibernate使用的Oracle方言。 - **`connection.password`**: Oracle数据库密码。 - **`connection.driver_class`**: ...
以上就是使用Hibernate进行Many-to-Many映射的完整流程。通过这种方式,我们可以方便地管理和维护两个实体之间的复杂关联,同时利用Hibernate自动处理中间表的创建和操作。在实际项目中,还可以根据需求调整映射策略...
4. **级联操作(Cascade)**:`cascade="delete"`表示当删除`Dept`时,所有关联的`Emp`也会被删除。`delete-orphan`则会在删除集合中的某个元素时,将其从数据库中移除,防止孤儿记录。 5. **一对多关系映射**: -...
3. **安装MySQL或其它数据库**:为了演示Hibernate如何与数据库交互,你需要安装一个数据库管理系统,如MySQL。安装完成后,创建一个数据库用于测试,并确保能够通过SQL命令行工具连接该数据库。 4. **下载...
- **级联删除**(cascade delete): 删除一个对象时,同时删除其关联对象。 #### 六、并发控制 - **悲观锁**: 在操作数据前加锁,直到操作完成后再释放锁。 - **乐观锁**: 不直接锁定数据,在提交更改前检查数据是否...
- **Inverse和cascade区别**:inverse控制哪一方负责关联的维护,而cascade控制关联对象的操作是否级联。 - **一对多双向关联映射总结**:总结一对多双向关联的特点及其应用场景。 #### 多对多关联映射单向(many-...
在映射这些关系时,需要考虑懒加载(`fetch = FetchType.LAZY`)和级联操作(`cascade = CascadeType.ALL`)的配置。 此外,`@Temporal(TemporalType.TIMESTAMP)`用于处理日期和时间类型,`@Lob`用于大对象(LOB)...
#### Hibernate cascade取值详解 - **Cascade Save-Update**: 当父对象被保存或更新时,其关联的所有子对象也将被保存或更新。 - **Cascade Delete**: 删除父对象时,所有关联的子对象也将被删除。 - **Cascade All-...