[英]Hibernate One-To-Many
休眠有问题。 我有实体用户
@Entity
@Table(name = "user")
public class User {
@Id
@Column(name = "user_id")
@GeneratedValue
private Long userId;
@Column
@NotBlank(message = "Fill login")
private String login;
@OneToMany(fetch=FetchType.LAZY,mappedBy="user")
private List<Order> orders;
public List<Order> getOrders() {
return orders;
}
public void addOrders(Order order) {
this.orders.add(order);
}
也像你可以看到用户有订单。 所以在ORDER表中,我有FK指向USER_ID,所以这是我的实体Order
@Entity
@Table(name = "order")
public class Order {
@Id
@Column(name="order_id")
@GeneratedValue
private long orderId;
@Column
private long user_id;
@Column
private Date dateBegin;
private Date dateEnd;
}
这是我的单元测试
public class HibernateTutorial extends BaseTest{
@Autowired
SessionFactory sessionFactory;
@Test
public void hibernateTutorial(){
System.out.print(sessionFactory);
List<User> users = sessionFactory.getCurrentSession().createQuery("from User").list();
List<Order> orders = users.get(0).getOrders();
System.out.print(orders);
Assert.assertNotNull(users);
}
}
运行它时出现异常:
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property entity.Order.user in entity.User.orders
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:576)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:541)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1177)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:324)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1162)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:717)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 38 more
我做错了什么?
这个:
@Column
private long user_id;
需要替换为
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
private User user;
以及多对一映射。
mappingBy属性指示关联表中定义关系的字段。 如果要按原样保留mapByBy,则需要添加:
private User user;
到您的订单班。 此外,您将需要在关系的这一侧添加一个@ManyToOne并定义join列的语义。 双向性并不总是必需的,但是在这种情况下,似乎您的业务需求是使用户获得已知订单,这是正确的方法。
通常,您应该在Hibernate实体之间使用完整的Object关系,而不是让实体引用彼此的id值。 Hibernate会为您正确管理保存和更新,并且获取ID与完整对象很容易,您可以自己进行管理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.