У меня есть 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
с автоподзаводом 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
}
я получаю исключение foolowing:
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)
...
Пункт в StackTrace является:
public class Item {
//other fields
@OneToMany(mappedBy = "id_item")
private Set<Basket> basketsWithThisItem;
public Item() {}
//generated getter and setters
}
Я попытался с различными конструкторами BasketId
(как (Item, Order)
и (int,int)
), как показано выше , и добавили Object
конструкторов к Basket
. Далее делал merge()
вместо save()
, но ничего не помогает.
Заранее спасибо.
EDIT Getters and Setters есть. Я использую функцию создания реализована в виде:
@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);
}
}
может показать мне код для сохранения – PSR
Код есть @PSR. Я добавил его в редактирование, но он уже был указан в сообщении между BasketId и Order. – Cornelius