2013-03-19 3 views
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 с автоподзаводом 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); 
    } 

} 
+0

может показать мне код для сохранения – PSR

+0

Код есть @PSR. Я добавил его в редактирование, но он уже был указан в сообщении между BasketId и Order. – Cornelius

ответ

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(); возвращающейся

+0

Возвращает int. – Cornelius

+0

, но вы объявили private Item id_item; – PSR

+0

Да, но в BasketId это int. – Cornelius

0

Добавить аксессор в свой @Embeddable класса. get/setId_Order(), get/setId_Item().

+0

@Cornelius показать мне код, где вы сохраняете – PSR

+1

жаль, что я отредактировал ваш код вместо моего кода. Возможно, отправьте свой код – PSR

+0

@PSR. Я вернул код Тодду Мюррею, спасибо, что указали его. – Javier

Смежные вопросы