【问题标题】:PersistenceException and IllegalArgumentException when calling merge with EntityManager调用与 EntityManager 合并时的 PersistenceException 和 IllegalArgumentException
【发布时间】:2018-01-09 08:22:22
【问题描述】:

我正在尝试使用自定义对象调用 Entitymanager.merge(),但我不断收到以下错误:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of my.package.model.offer.Cost.id
java.lang.IllegalArgumentException: Can not set int field my.package.model.offer.Cost.id to java.lang.String

好像Cost.id的getter不能被调用,莫名其妙的返回值是String,但应该是int

这是我的模型类Cost

@Entity
public class Cost implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Lob
    @Column(length = 65535)
    private String description;

    public Cost(String description) {
        this.description = description;
    }

    public Cost() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

这是我的控制器(ManagedBean),它试图调用EntityManager.persist()

@ManagedBean(name = "offerController")
@SessionScoped
public class OfferController {
    @PersistenceContext
    private EntityManager em;

    private Offer offerCurrent = new Offer();

    public String saveCosts() {
        offerCurrent.setCosts(costsCurrent);
        try {
            utx.begin();
            offerCurrent = em.merge(offerCurrent);
            utx.commit();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RollbackException e) {
            e.printStackTrace();
        } catch (HeuristicMixedException e) {
            e.printStackTrace();
        } catch (HeuristicRollbackException e) {
            e.printStackTrace();
        }
        return Links.OFFERS.getLink();
    }
}

这是我的JSF页面上的按钮,调用了saveCosts()方法:

<p:commandButton action="#{offerController.saveCosts()}" value="Save" />

什么可能导致这个问题,有没有办法解决它?

【问题讨论】:

    标签: java hibernate jpa entitymanager


    【解决方案1】:

    您尝试合并一个新对象。 EntityManager#merge 仅允许用于现有对象(根据手册:IllegalArgumentException - 如果实例不是实体或已删除实体)。插入必须使用 EntityManager#persist 完成。 我怀疑,你改变了代码。所以我不知道最初的问题是什么。

    OfferController 是 SessionScoped,你使用的是 http-sessions 吗?必须在会话开始时插入(使用持久化)Offer,并且必须与以后的使用合并。

    【讨论】:

      【解决方案2】:

      您的代码毫无意义。

      请阅读基本的 JPA 教程,因为现在您正在调用 mergepersist 操作。

      如果您希望 Hibernate 管理非托管实体并且实体状态将为 New,则使用 Persist。

      如果您有一个分离的实体并且您希望通过更改传播将其附加到当前持久性上下文,则使用合并。

      但你不想同时使用它们。

      【讨论】:

      • 两个调用中的第一个出现错误:在merge。所以这不是原因,尽管我同意,同时使用mergepersist 没有意义。编辑我的帖子以避免误解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多