我正在尝试使用自定义对象调用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" />
什么可能导致这个问题,有没有办法解决它?
答案 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。
如果您有一个分离的实体,并且希望将其附加到具有更改传播的当前持久性上下文,则使用合并。
但是你不想同时使用它们。