Error by persisting entity beans with n:m relationship
bobby80 Jun 10, 2008 1:00 PMI get the following error by persisting an entity bean:
11:56:08,316 FATAL [application] javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: org.domain.ConfigBaukasten.entity.ParamInstance
my bean entities are:
- Configuration.java
@Entity @Name("configuration") public class Configuration implements Serializable { //seam-gen attributes (you should probably edit these) private Long id; private Integer version; private String name; private List<ParamInstance> params = new ArrayList<ParamInstance>(); @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Version public Integer getVersion() { return version; } private void setVersion(Integer version) { this.version = version; } @Length(max=20) public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(mappedBy="configuration", cascade=CascadeType.ALL) public List<ParamInstance> getParams() { return params; } public void setParams(List<ParamInstance> params) { this.params = params; } }
- ParamInstance.java
@Entity public class ParamInstance implements Serializable { //seam-gen attributes (you should probably edit these) private Long id; private Integer version; private String name; private Parameter parameter; private int value; private Date validFrom; private Date validUntil; private Configuration configuration; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Version public Integer getVersion() { return version; } private void setVersion(Integer version) { this.version = version; } @Length(max=20) public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToOne(fetch=FetchType.LAZY, optional=false) @JoinColumn(name = "parameter_id") public Parameter getParameter() { return parameter; } public void setParameter(Parameter parameter) { this.parameter = parameter; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Date getValidFrom() { return validFrom; } public void setValidFrom(Date validFrom) { this.validFrom = validFrom; } public Date getValidUntil() { return validUntil; } public void setValidUntil(Date validUntil) { this.validUntil = validUntil; } @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="configuration") public Configuration getConfiguration() { return configuration; } public void setConfiguration(Configuration configuration) { this.configuration = configuration; } }
and session bean is:
@Stateful @Name("ParamAction") public class ParamActionBean implements ParamAction { @Logger private Log log; @PersistenceContext(type = EXTENDED) private EntityManager em; //@In // private Configuration configuration; @Out (required=false) private List<SelectItem> parameters = null; @Out (required=false) private List<SelectItem> paramInsts = null; @Factory("parameters") public void findParameters() { parameters = new ArrayList<SelectItem>(); Map<String, Parameter> allParamsMapped = new HashMap<String,Parameter>(); Parameter param; for(Iterator<Parameter> it = ((List<Parameter>)em.createQuery("select p from Parameter p").getResultList()).iterator(); it.hasNext();){ SelectItem item = new SelectItem(); param = (Parameter)it.next(); item.setValue( param); item.setLabel((param.getId()).toString()); parameters.add( item ); allParamsMapped.put(param.getName(), param); } Contexts.getConversationContext().set("allParametersMapped", allParamsMapped); } @Factory("paramInsts") public void findParamInstances(){ paramInsts = new ArrayList<SelectItem>(); ParamInstance paramInst; Map<String, ParamInstance> allParamInstsMapped = new HashMap<String,ParamInstance>(); for(Iterator<ParamInstance> it = ((List<ParamInstance>)em.createQuery("select pi from ParamInstance pi").getResultList()).iterator(); it.hasNext();){ SelectItem item = new SelectItem(); paramInst = (ParamInstance)it.next(); item.setValue(paramInst); item.setLabel(paramInst.getName()); paramInsts.add(item); allParamInstsMapped.put(paramInst.getName(), paramInst); } Contexts.getConversationContext().set("allParamInstsMapped", allParamInstsMapped); } /* public String save(){ em.merge(configuration); return ""; }*/ public List<SelectItem> getParameters() { return parameters; } public void setParameters(List<SelectItem> parameters) { this.parameters = parameters; } @Remove @Destroy public void destroy() {} }
The xhtml is:
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message"/>
<h:form id="configurationForm">
<rich:panel>
<f:facet name="header">configuration</f:facet>
<s:decorate id="nameDecoration" template="layout/edit.xhtml">
<ui:define name="label">Name</ui:define>
<h:inputText id="name" required="true"
value="#{configurationHome.instance.name}"/>
</s:decorate>
<s:decorate id="ParamInstsDecoration" template="layout/edit.xhtml">
<ui:define name="label">Parameter Instances</ui:define>
<h:selectManyMenu value="#{configurationHome.instance.params}" converter="ParamInstConverter">
<f:selectItems value="#{paramInsts}" />
</h:selectManyMenu>
</s:decorate>
<div style="clear:both"/>
</rich:panel>
<div class="actionButtons">
<h:commandButton id="save"
value="Save"
action="#{configurationHome.persist}"
rendered="#{!configurationHome.managed}"/>
<h:commandButton id="update"
value="Save"
action="#{configurationHome.update}"
rendered="#{configurationHome.managed}"/>
<h:commandButton id="delete"
value="Delete"
action="#{configurationHome.remove}"
rendered="#{configurationHome.managed}"/>
<s:button propagation="end"
id="done"
value="Done"
view="/configurationList.xhtml"/>
</div>
</h:form>
</ui:define>
any idea?