一的一方:
@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的映射文件了
建表或者建立字段的时候一定要细心,有好几次都是表名或者字段名是关键字,导致程序运行的时候报了语法错误,找了好久才发现是这个问题,所以在这里记录一下这个坑,以免以后再犯。
本文介绍了一对多关系在Hibernate中的实现方式,通过实体类User和UserOrder展示了一对多的关系映射,并提供了详细的代码示例。
1266





