Hibernate3自动建表总有一张建立不成功问题及其解决!
来源:互联网 发布:lee淘宝代购是真的吗 编辑:程序博客网 时间:2024/06/14 15:39
所涉对象
四个持久化对象(User、ServicePrudoct、State、Order),四张表(user、service_product、state、order)。
对象间关系
前三者和Order之间均存在一对多(one-to-many)关系,每个的映射文件中均有一个set配置节;Order和前三者之间均存在多对一(many-to-one)关系,Order的映射文件中存在三个many-to-one配置节。
问题现象
在struts1.3、sprint2.5、hibernate3.2环境下,user、service_product、state表均成功生成,而order表不能生成,提示以下hql语句存在语法错误:
create table order (order_id INT NOT NULL AUTO_INCREMENT , order_date DATE NOT NULL , order_message VARCHAR( 64 ) NOT NULL , order_attachement VARCHAR( 255 ) NOT NULL , user_id INT NOT NULL , service_product_id INT NOT NULL , state_id INT NOT NULL , PRIMARY KEY ( order_id))
分析试验
因为成功生成的表格和其他表格均是独立表格,相互间没有关系,最先怀疑,是多对一或一对多配置有问题,但参考若干成功范例发现,没有什么错误,最后求助于Hibernate3的文档7章“关联关系映射”,将其“7.4.1 双向关联”提供的实例加入同一Project:
7.4.1. 一对多(one to many) / 多对一(many to one)
双向多对一关联 是最常见的关联关系。(这也是标准的父/子关联关系。)
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<set name="people" inverse="true">
<key column="addressId"/>
<one-to-many class="Person"/>
</set>
</class>
没有发现问题,成功生成了表格。
没辙,查不出问题来,继续试验,想这User等三个对象均和Order对象存在关系,我何不先简单化,添加一个Article对象,让它先只和User发生关系,然后再逐个添加另外两个关系,这样试验了一下,发现居然也没有问题,能成功生成表格。此时,还是没有想到问题在哪。最后想,那就把原来的Order对象和映射文件删除,将Article对象和映射文件复制一份,修改成Order对象和映射文件,这样一改,居然又不行了。此时,发现,只改过名称,难道是名称有问题,名称和mysql的关键字冲突?在映射文件里,将Order对象的“table = "order"”改为“table = "tbl_orfer"”一试,果然如此。
总结教训
用Hibernate直接生成数据库,看起来和sql语句没关系了,可一样不能忽视和关键字冲突的问题!!!
另外:在表名前面加前缀“tbl_”是个好习惯!!!
hbm文件
User.hbm.xml
<class name="User" table="user">
<id name="id" type="java.lang.Integer" column="user_id">
<generator class="identity"/>
</id>
<property name="email" column="email" type="java.lang.String" not-null="true" length="128" unique="true"/>
<property name="password" column="password" type="java.lang.String" not-null="true" length="64"/>
<property name="firstName" column="first_name" type="java.lang.String" not-null="true" length="32"/>
<property name="lastName" column="last_name" type="java.lang.String" not-null="false" length="32"/>
<property name="phoneNumber" column="phone_number" type="java.lang.String" not-null="true" length="32"/>
<set name="orders" inverse="true">
<key column="user_id" />
<one-to-many class="Order" />
</set>
</class>
ServiceProduct.hbm.xml
<class name="ServiceProduct" table="tbl_service_product">
<id name="id" type="java.lang.Integer" column="service_product_id">
<generator class="identity"/>
</id>
<property name="serviceProductTitle" column="serviceProductTitle" type="java.lang.String" not-null="false" length="255"/>
<property name="serviceProductDescription" column="serviceProductDescription" type="java.lang.String" not-null="true" length="1024"/>
<property name="serviceProductImagePath" column="serviceProductImagePath" type="java.lang.String" not-null="false" length="255"/>
<property name="serviceProductPrice" column="serviceProductPrice" type="java.lang.Double" not-null="true" length="12"/>
<set name="orders" inverse="true">
<key column="service_product_id" />
<one-to-many class="Order" />
</set>
</class>
State.hbm.xml
<class name="State" table="tbl_state">
<id name="id" type="java.lang.Integer" column="state_id">
<generator class="identity"/>
</id>
<property name="stateName" column="state_name" type="java.lang.String" not-null="false" length="32" />
<property name="stateDescription" column="state_description" type="java.lang.String" not-null="false" length="255" />
<set name="orders" inverse="true">
<key column="state_id"/>
<one-to-many class="Order"/>
</set>
</class>
Order.hbm.xml
<class name="Order" table="tbl_order" >
<id name="id" type="java.lang.Integer" column="order_id">
<generator class="identity"/>
</id>
<property name="orderDate" column="order_date" type="java.util.Date" not-null="true" length="0"/>
<property name="orderMessage" column="order_message" type="java.lang.String" not-null="false" length="64"/>
<property name="orderAttachment" column="order_attachment" type="java.lang.String" not-null="false" length="255"/>
<many-to-one name="orderUser" column="user_id" not-null="true" lazy="false"/>
<many-to-one name="orderServiceProduct" column="service_product_id" not-null="true" lazy="false"/>
<many-to-one name="orderState" column="state_id" not-null="true" lazy="false"/>
</class>
- Hibernate3自动建表总有一张建立不成功问题及其解决!
- 解决ORACLE启动不成功问题
- Ueditor(三):解决1.4版本中取消自动保存不成功的问题
- 终于解决无线连接不成功的问题了
- 解决笔记本安装系统不成功的问题
- 解决mysql设置密码不成功问题
- 解决android SDK升级不成功的问题
- UEditor解决设置文本不成功问题
- Keil问题及其解决
- 解决从activitygrou的子activity相互跳转不成功问题
- 解决mysql卸载后重复安装不成功的问题
- android - 解决SDK Mananger更新慢或不成功的问题
- 如何解决IE浏览器打开orcale企业管理器不成功问题
- 解决Xcode 命令行打包时证书签名不成功的问题
- 如何解决Android sdk tool的下载不成功的问题
- myeclipse创建svn资源库时连接不成功问题的解决
- 解决POI3.10 添加图片不成功的问题
- 解决git pull到github不成功的问题
- struts-menu
- Android事件处理
- 前车之鉴——“六拍”项目的深度思考
- 自增自减运算的原理解析
- 条款39:明智而审慎的适用private继承
- Hibernate3自动建表总有一张建立不成功问题及其解决!
- oracle中查看用户权限
- 迅雷终结者
- Android的垃圾回收机制
- 开源BI平台Openi的开发数据仓库系统(上)
- Nginx
- RecordStore实现类似于SQL功能
- 封装集合(Encapsulate Collection)--代码重构1
- Win版VirtualBox从USB设备启动方法