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

来源:互联网 发布:淘宝运营 策划能力 编辑:程序博客网 时间:2024/06/16 18:26

这几天的颓废和拖延

不知道为什么,一个月总有那么几天心不在焉。硬坐在电脑边上,努力定心地去敲代码,却总是力不从心。打开了熟悉的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 classorg.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>
原创粉丝点击