繁体   English   中英

一对多休眠

[英]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

我做错了什么?

您在Order类中需要一个User实例。

这是一对多示例。

因此,您可以在Order类中添加以下内容:

private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public User getUser() {
  return this.user;
}

这个:

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM