调用与EntityManager的合并时出现PersistenceException和IllegalArgumentException

时间:2017-08-02 08:16:58

标签: java hibernate jpa entitymanager

我正在尝试使用自定义对象调用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" />

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

你的代码毫无意义。

请阅读基本的JPA教程,因为您现在也在调用catch (Exception ex) { var log = (ex.Message + "\n" + ex.StackTrace ); var extemp = ex.InnerException; while (extemp != null) { log += "\n\n\n" + extemp.Message + "\n" + extemp.StackTrace; extemp = extemp.InnerException; } return log; } merge操作。

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

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

但是你不想同时使用它们。