私は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)
追加しました。次は代わりに実行していましたが、何も役に立ちません。Object
Basket
merge()
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);
}
}