Hibernate做好这几步,轻松完成一对多关系映射配置(实例)

本文记录了解决Hibernate框架中many-to-one配置错误的过程,包括遇到的具体异常、配置问题定位及解决步骤。

这几天的颓废和拖延

不知道为什么,一个月总有那么几天心不在焉。硬坐在电脑边上,努力定心地去敲代码,却总是力不从心。打开了熟悉的IDEA,写了两行注释,却再也写不下去了。可能是天气变冷了吧,人的惰性又出来作祟了。答应了同学好久的接口,一天一天的拖延了下来。还有好多工作都没做完呢,可是我却没有当初的那个状态了。配置Hibernate错误也是层出不穷。花了好长的时间来修改bug,总算是弄好了

总有bug,在催促着你成长

在控制台中看到的错误信息,都是获取sessionFactory时出的错。这说明和我们本身写的代码无关。后来检查了好几遍配置文件信息基本没有发现什么问题。以为刚开始写配置文件的时候就是从网上参考的代码配置many to one,但是控制台一直报错。

Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of entity.Rider.id
    at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:64)
    at...
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:41)
    ... 30 more

看错误信息好像是没有找到Rider.id的get方法,并且Hibernate框架的反射也出现了错误。
关于get方法,我确信我是不会写错的。在检查并且测试了好几遍之后,我终于放弃了get方法。继续检查配置文件。
后来发现还是many to one这个属性没用好。一方面要在本类定义外键另一方面在外键的那个类也要定义one to many属性。
详细的配置步骤如下

1.定义普通的javaBean

这里解释一下我的这两个类。
Rider类是骑手,可以拥有多个账单流水。于是要在这个类里面定义set集合存放account类。表示当前rider拥有的account
Account类是账单流水类。这个类要定义Rider属性,表明当前账单流水属于哪个骑手。
两个类的代码如下:省略构造方法和set get

package entity;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by zipple on 2017/10/18.
 * 骑手
 */
public class Rider {
    private int id;//骑手id
    private String username;//骑手用户名
    private String password;//骑手登录密码
    private String phone;//联系电话
    private int creditScore;//信誉积分,默认为20
    private int deposit;//交纳押金  默认100
    private int balance;//余额---接单所获酬劳
    private int cancelCount;//取消订单数量,超过2次即取消接单资格
    private int remainCount;//本日剩余接单数,凌晨自动重置为3
    private Date createdAt;

    private Set<Account> accounts = new HashSet<>();//一个骑手可以有多个账单流水
    //省略set get 构造方法
}
package entity;

import java.util.Date;

/**
 * Created by zipple on 2017/10/18.
 * 账户明细,骑手账单流水
 */
public class Account {
    private int id;//账单流水id
    private double details;//账单流水
    private int type;//流水方式
    private Date createAt;//流水创建时间

    private Rider rider;//此订单所属骑手
}
编写配置文件*.hbm.xml

Rider类由于有set属性,这里要配置one to many属性,具体配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="entity.Rider" table="rider">

        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="username" column="username"/>
        <property name="password" column="password"/>
        <property name="phone" column="phone"/>

        <property name="creditScore" generated="insert">
            <column name="creditScore" default="30" not-null="true"/>
        </property>
        <property name="deposit" generated="insert"><!--默认没交押金-->
            <column name="deposit" default="0" not-null="true"/>
        </property>
        <property name="balance" generated="insert">
            <column name="balance" default="0" not-null="true"/>
        </property>
        <property name="cancelCount" generated="insert">
            <column name="cancelCount" default="0" not-null="true"/>
        </property>
        <property name="remainCount" generated="insert">
            <column name="remainCount" default="3" not-null="true"/>
        </property>

        <property name="createdAt" generated="insert">
            <column name="createdAt" sql-type="timestamp" default="CURRENT_TIMESTAMP" not-null="true" />
        </property>

        <set name="accounts" cascade="save-update,delete">
            <key column="id"/><!--rider类的id,即是Account的外键-->
            <one-to-many class="entity.Account"/>
        </set>
    </class>
</hibernate-mapping>

account类配置信息:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="entity.Account" table="account">

        <id name="id" column="id">
            <generator class="native"/>
        </id>

        <!--流水明细属于多的一方,可以根据多的一方决定骑手-->
        <!--需要定义class属性完成一对多配置,riderId根据rider的主键id生成-->
        <many-to-one name="rider" column="riderId" class="entity.Rider" not-null="true"/>


        <property name="details" column="details"/>
        <property name="type" column="type"/>

        <property name="createAt" generated="insert">
            <column name="createdAt" sql-type="timestamp" default="CURRENT_TIMESTAMP" not-null="true" />
        </property>
    </class>
</hibernate-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值