DataModelSelection and transient object
gschaden Apr 3, 2008 6:18 PMI'm using seam 2.0.1.GA and tomcat 6.0.16.
There is one action in session scope
import java.util.List; import javax.ejb.Stateful; import javax.persistence.EntityManager; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.datamodel.DataModel; import org.jboss.seam.annotations.datamodel.DataModelSelection; import org.jboss.seam.annotations.web.RequestParameter; import org.jboss.seam.faces.FacesMessages; import org.jboss.seam.log.Log; import org.jboss.seam.security.Identity; @Name("deviceaction") @Scope(ScopeType.SESSION) public class DeviceAction { @Logger Log log; @In private FacesMessages facesMessages; @In private EntityManager entityManager; @DataModel private List<Device> devices; @DataModelSelection(value="devices") private Device device; private String searchString; private int pageSize = 10; private int page; public void persist() { log.debug("persisting device instance"); try { entityManager.persist(device); log.debug("persist successful"); } catch (RuntimeException re) { log.error("persist failed", re); throw re; } } public void deleteDevice() { log.info("delete Object #0", device); if (device != null) { devices.remove(device); entityManager.remove(device); entityManager.flush(); facesMessages.add("Device " + device.getSnr() + " removed"); } } public Device findById(int id) { log.debug("getting Configobject instance with id: " + id); try { Device instance = entityManager.find(Device.class, id); log.debug("get successful"); return instance; } catch (RuntimeException re) { log.error("get failed", re); throw re; } } @SuppressWarnings("unchecked") public void getAll() { log.debug("getting all Configobjects"); try { devices = entityManager.createQuery("select e from Device e").getResultList(); } catch (RuntimeException re) { log.error("get failed", re); throw re; } } public void logDevice(){ log.info("selected device #0", device); } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public boolean isNextPageAvailable() { return (devices != null) && (devices.size() == pageSize); } public String getSearchString() { return searchString; } public void setSearchString(String searchString) { this.searchString = searchString; } public void nextPage() { page++; queryEntries(); } public void find() { page = 0; if (getSearchPattern().length()<3) return; if (devices != null) { devices.clear(); } queryEntries(); } @SuppressWarnings("unchecked") private void queryEntries() { log.info("Querying devices ... #0", getSearchPattern()); devices = entityManager.createQuery( "select e from Device e where lower(e.snr) like #{pattern}" + " or lower(e.mac) like #{pattern}" // + " and (e.user.name = #{user.name}) ) .setMaxResults(pageSize) .setFirstResult(page * pageSize).getResultList(); } @Factory(value = "pattern", scope = ScopeType.EVENT) public String getSearchPattern() { return (searchString == null) ? "%" : ('%' + searchString.toLowerCase().replace('*', '%') + '%'); } public int getPageSize() { return pageSize; } }
if i click on a link
<s:link onclick="return confirmDeletion()" id="deleteEntry" action="#{deviceaction.deleteDevice}"> <h:graphicImage value="/img/delete.png" alt="[Delete]" style="border:0"/> </s:link
I get the following
INFO: delete Object Device: 1 dfe asdf 03.04.2008 16:47:27 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity INFO: handling transient entity in delete processing
why is this object transient? I tried to merge it, but that didnt work either. In this case hibernate tried to insert the object and got an error, because of duplicate key.