当前位置: 首页 > 知识库问答 >
问题:

无法使用复合密钥持久化临时对象

杨无尘
2023-03-14

我有一个Hibernate(3.3)entityBasket

@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会话作为会话()。保存(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(作为(项目,订单),和(int,int))的不同构造函数,并将对象构造函数添加到篮子。接下来是执行merge(),而不是save(),但没有任何帮助。

提前谢谢。

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

}

共有2个答案

刘意
2023-03-14

将访问器添加到您的@嵌入式类。get/setId_Order(),get/setId_Item()。

翟棋
2023-03-14

错误就存在于这里

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

 类似资料:
  • 问题内容: 我有POJO类: 然后,我创建一张票证和一些地方: 现在,我想将其保存到数据库: 在MapperConfig.xml中,我这样写: 如何以自动模式保存 列表位置 ?MyBatis可以为我保存吗?还是我需要使用 foreach 手动进行迭代,然后手动插入每个 地方 ? 谢谢你的帮助。 问题答案: 即使MyBatis能够支持相反的方向(即在查询过程中使用嵌套选择或联接填充列表),也没有自动

  • Hibernate 认为持久化类(persistent class)新实例化的对象是瞬时(Transient)的。我们可通过将瞬时(Transient)对象与 session 关联而把它变为持久的(Persistent)。 DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex('M');

  • 我创建了一个简单的3实体数据模型,当试图持久化数据时,它不起作用。下面是实体及其id类,server: 服务: 容器: 创建的数据库似乎正常:

  • 我得到了这个错误: 组织。冬眠TransientObjectException:对象引用未保存的临时实例-在刷新之前保存临时实例 我以前没有保存过的对象是: 我无法将CascadeType更改为All,因为该对象位于另一个方案中,我没有写入该方案的权限。 有什么想法吗? 谢啦

  • 我有一个类通知,它包含一个对象MessengerData:

  • 假设我想要一个复合键作为采购订单实体的street,city。 下面是我如何识别做这件事, 我想明白@AttributeOverrides注释到底是做什么的?即使我将colomn name更改为something STREET1,我仍然看到使用列名street创建的表。那么column=@column(name=“street”))在这里做什么。 另外,我可以将它作为PurchaseOrder类的