0

休止状態に問題があります。私はエンティティユーザーを持っています

@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 テーブルには USER_ID を指す FK があるので、ここに私のエンティティ 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

私は何を間違っていますか?

4

3 に答える 3

0

Order クラスに User のインスタンスが必要です。

これは一対多の例です。

したがって、次のようなものを Order クラスに追加できます。

private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public User getUser() {
  return this.user;
}
于 2012-05-25T16:19:17.597 に答える
0

これ:

@Column 
private long user_id;

への参照に置き換える必要があります。

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
private User user;

および多対 1 のマッピング。

于 2012-05-25T16:24:38.230 に答える
0

MappedBy 属性は、リレーションシップを定義した関連付けられたテーブルのフィールドを示します。MappedBy をそのまま維持したい場合は、以下を追加する必要があります。

private User user;

ご注文クラスへ。さらに、関係のこちら側に @ManyToOne を追加し、結合列のセマンティクスを定義する必要があります。双方向性は常に必要なわけではありませんが、この場合、ビジネス ニーズはユーザーに既知の順序を与えることであり、それは正しいアプローチです。

原則として、エンティティが互いの id 値を参照するのではなく、Hibernate エンティティ間で完全なオブジェクト関係を使用する必要があります。Hibernate は保存と更新を適切に管理し、ID と完全なオブジェクトのフェッチは自分で簡単に管理できます。

于 2012-05-25T16:29:05.613 に答える