hibernate基于实体类注解实现一对多的配置

本文介绍了一对多关系在Hibernate中的实现方式,通过实体类User和UserOrder展示了一对多的关系映射,并提供了详细的代码示例。

一的一方:

@Entity
@Table(name = "user")
public class User {
    private  Long id;
    private  String name;
    private  String address;
    private  Integer age;
    private Date createTime;
    private  Date updateTime;
    private Set<UserOrder> listOrder;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)//mappedBy = "user"是设置关系由多的一方维护,cascade为级联操作
    public Set<UserOrder> getListOrder() {
        return listOrder;
    }

    public void setListOrder(Set<UserOrder> listOrder) {
        this.listOrder = listOrder;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)//主键生成策略
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
    
    @Column(nullable = false,name = "name",length = 50)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    @Column(nullable = false,name = "address")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    
    @Column(nullable = false,name = "age",length = 3)
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(updatable = false)
    @org.hibernate.annotations.CreationTimestamp
    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(updatable = true)
    @org.hibernate.annotations.CreationTimestamp
    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", age=" + age +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                ", listOrder=" + listOrder +
                '}

多的一方:

@Entity
@Table(name = "t_order")//对应的表的名字
public class UserOrder {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "user_id")//user_id为t_order表中的user_id字段名(hibernate会自动帮我们生成外键)
    private User user;

    @Column(name = "order_name")//如果不设置name参数则默认表里的字段名与实体类的属性名一致,如果表的字段名与实体类属性不一致则name参数的值就就是表里面对应的字段名
    private String orderName;

    @Column(name = "create_date")
    private Date createDate;

    public long getId() {
        return id;
    }

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

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    @Override
    public String toString() {
        return "UserOrder{" +
                "id=" + id +
                ", orderName='" + orderName + '\'' +
                ", createDate=" + createDate +
                '}';
    }
}

配置文件applicationContext.xml:

<!-- Hibernate session factory -->
<bean id="sessionFactory" name="sf" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.mysql.entity"/><!--需要在这里设置扫描实体类-->
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
            <prop key="hibernate.enable_lazy_load_no_trans">${hibernate.enable_lazy_load_no_trans}</prop>
        </props>

    </property>
</bean>

在实体类使用注解的方式配置关系就不需要再创建hibernate的映射文件了

建表或者建立字段的时候一定要细心,有好几次都是表名或者字段名是关键字,导致程序运行的时候报了语法错误,找了好久才发现是这个问题,所以在这里记录一下这个坑,以免以后再犯。



评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值