【问题标题】:Unable to persist a transient object with composite key无法使用复合键持久化瞬态对象
【发布时间】:2013-03-19 17:28:23
【问题描述】:

我有一个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
}

问题是当我想将带有自动连接的SessionFactory session 的瞬态Order 保存为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)
...

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(),但没有任何帮助。

提前致谢。

编辑 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);
    }

}

【问题讨论】:

  • 你能告诉我保存的代码吗
  • 代码在@PSR那里。我在编辑中添加了它,但它已经在 BasketId 和 Order 之间的帖子中给出了。

标签: spring hibernate spring-mvc


【解决方案1】:

此处存在错误

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();返回

【讨论】:

【解决方案2】:

将访问器添加到您的 @Embeddable 类。获取/setId_Order(),获取/setId_Item()。

【讨论】:

  • 对不起,我编辑了你的代码而不是我的代码。你能发布你的代码吗
  • @PSR 我恢复了 Todd Murray 的代码,感谢您指出。
  • 他们在那里,但我忘了把它放在 cmets 中。
猜你喜欢
  • 2013-10-27
  • 2013-01-06
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多