1

私はHibernate(3.3)エンティティを持っていますBasket:

@Entity
@Table(name = "BASKETS")
@IdClass(BasketId.class)
public class Basket {

    @ManyToOne
    @Id
    @JoinColumn(name = "id_order", referencedColumnName = "id_o")
    private Order id_order;

    @ManyToOne
    @Id
    @JoinColumn(name = "id_item", referencedColumnName = "id_i")
    private Item id_item;

    private int amount;

    public Basket() {}

    // generated getters and setters
}

そのままBasketIdで:

@Embeddable
public class BasketId implements Serializable {

    private int id_order;
    private int id_item;

    public BasketId() {}

    public BasketId(Order o, Item i) {
        id_order = o.getId_o();
        id_item = i.getId_i();
    }

    // public BasketId(int id_order, int id_item) {
    // this.id_item = id_item;
    // this.id_order = id_order;
    // }

    //generated getter and setters
}

Order問題は、 autowired でトランジェントを次のSessionFactory sessionように保存したい場合ですsession().save(o)

@Entity
@Table(name = "ORDERS")
public class Order {
    @Id
    @GeneratedValue
    @Column(name = "id_o")
    private int id_o;

    @Column(name = "date")
    private Timestamp date;

    @OneToMany(mappedBy = "id_order")
    private Set<Basket> basketItems;

    public Order() {}
    //generated getter and setters
}

私はばかげた例外を受け取ります:

message Request processing failed; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of foo.server.hib.BasketId.id_item

description The server encountered an internal error that prevented it from fulfilling this request.

exception

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of foo.server.hib.BasketId.id_item
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)

root cause

    org.hibernate.PropertyAccessException: could not set a field value by reflection setter of foo.server.hib.BasketId.id_item
    org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:114)
    org.hibernate.tuple.component.AbstractComponentTuplizer.setPropertyValues(AbstractComponentTuplizer.java:104)
...
root cause

    java.lang.IllegalArgumentException: Can not set int field foo.server.hib.BasketId.id_item to foo.server.hib.Item
    sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
    sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:80)
...

スタック トレースの項目は次のとおりです。

public class Item {
    //other fields
    @OneToMany(mappedBy = "id_item")
    private Set<Basket> basketsWithThisItem;

    public Item() {}
    //generated getter and setters
}

BasketId上記のように(as (Item, Order)、および)のさまざまなコンストラクターを試し、コンストラクターを に(int,int)追加しました。次は代わりに実行していましたが、何も役に立ちません。ObjectBasketmerge()save()

前もって感謝します。

EDIT Getter と Setter があります。次のように実装された create 関数を使用します。

@Transactional
public class HibOrderService implements OrderService {
    @Autowired
    private SessionFactory sessionFactory;

    public Session session() {
        return sessionFactory.getCurrentSession();
    }    

    @Override
    public void create(Order o) {
        session().merge(o);
    }

}
4

2 に答える 2

0

エラーはここに存在します

Can not set int field foo.server.hib.BasketId.id_item to foo.server.hib.Item




 public BasketId(Order o, Item i) {
        id_order = o.getId_o();
        id_item = i.getId_i();
    }

ここで問題は何を i.getId_i();返すか

于 2013-03-19T17:31:51.133 に答える
0

@Embeddable クラスにアクセサーを追加します。get/setId_Order()、get/setId_Item()。

于 2013-03-19T17:39:54.820 に答える