EntityHome Update Ignored for EmbeddedId
jhahn Jun 11, 2009 4:46 AMHello,
I have a many-to-many relationship between users and roles in my project. I can create and delete fine, however, my update call is being ignored (verified by watching INFO STDOUT Hibernate: in log).
Here are my entities --
@Embeddable public class AppstoreUserRoleMapId implements java.io.Serializable { private long userId; private long roleId; public AppstoreUserRoleMapId() { } public AppstoreUserRoleMapId(long userId, long roleId) { this.userId = userId; this.roleId = roleId; } @Column(name = "userId", nullable = false) public long getUserId() { return this.userId; } public void setUserId(long userId) { this.userId = userId; } @Column(name = "roleId", nullable = false) public long getRoleId() { return this.roleId; } public void setRoleId(long roleId) { this.roleId = roleId; } public boolean equals(Object other) { if ((this == other)) return true; if ((other == null)) return false; if (!(other instanceof AppstoreUserRoleMapId)) return false; AppstoreUserRoleMapId castOther = (AppstoreUserRoleMapId) other; return (this.getUserId() == castOther.getUserId()) && (this.getRoleId() == castOther.getRoleId()); } public int hashCode() { int result = 17; result = 37 * result + (int) this.getUserId(); result = 37 * result + (int) this.getRoleId(); return result; } } @Name("appstoreUserRoleMapHome") public class AppstoreUserRoleMapHome extends EntityHome<AppstoreUserRoleMap> { private static final long serialVersionUID = 2498650140430778232L; private static boolean roleSelected = false; private static boolean userSelected = false; @In(create = true) AppstoreUserHome appstoreUserHome; @In(create = true) AppstoreUserRoleHome appstoreUserRoleHome; public void setAppstoreUserRoleMapId(AppstoreUserRoleMapId id) { setId(id); } public AppstoreUserRoleMapId getAppstoreUserRoleMapId() { return (AppstoreUserRoleMapId) getId(); } public AppstoreUserRoleMapHome() { setAppstoreUserRoleMapId(new AppstoreUserRoleMapId()); } @Override public boolean isIdDefined() { if (getAppstoreUserRoleMapId().getRoleId() == 0) return false; if (getAppstoreUserRoleMapId().getUserId() == 0) return false; return true; } @Override protected AppstoreUserRoleMap createInstance() { AppstoreUserRoleMap appstoreUserRoleMap = new AppstoreUserRoleMap(); appstoreUserRoleMap.setId(new AppstoreUserRoleMapId()); return appstoreUserRoleMap; } public void load() { if (isIdDefined()) { wire(); } } public void wire() { getInstance(); AppstoreUser appstoreUser = appstoreUserHome.getDefinedInstance(); if (appstoreUser != null) { getInstance().setAppstoreUser(appstoreUser); } AppstoreUserRole appstoreUserRole = appstoreUserRoleHome.getDefinedInstance(); if (appstoreUserRole != null) { getInstance().setAppstoreUserRole(appstoreUserRole); } } public boolean isWired() { if (getInstance().getAppstoreUser() == null) return false; if (getInstance().getAppstoreUserRole() == null) return false; if( !roleSelected || !userSelected ) return false; return true; } public AppstoreUserRoleMap getDefinedInstance() { return isIdDefined() ? getInstance() : null; } public void ValueChangeListener( ValueChangeEvent e ) { String componentId = e.getComponent().getId(); Long id = Long.parseLong( e.getNewValue().toString() ); if( id.intValue() == 0 ) { if( componentId.equals( "roleId" ) ) roleSelected = false; else if( componentId.equals( "userId" ) ) userSelected = false; return; } // Update event if( this.isManaged() ) { getEntityManager().flush(); if( componentId.equals( "roleId" ) ) { instance.getId().setRoleId( id ); appstoreUserRoleHome.setId( Long.parseLong( e.getNewValue().toString() ) ); roleSelected = true; } else if( componentId.equals( "userId" ) ) { instance.getId().setUserId( id ); appstoreUserHome.setId( id ); userSelected = true; } } // Add event if( componentId.equals( "roleId" ) ) { instance.getId().setRoleId( id ); appstoreUserRoleHome.setId( Long.parseLong( e.getNewValue().toString() ) ); roleSelected = true; } else if( componentId.equals( "userId" ) ) { instance.getId().setUserId( id ); appstoreUserHome.setId( id ); userSelected = true; } System.out.println( "Set " + componentId + " to " + e.getNewValue().toString() ); } } @Name("appstoreUserRoleMapList") public class AppstoreUserRoleMapList extends EntityQuery<AppstoreUserRoleMap> { private static final String EJBQL = "select appstoreUserRoleMap from AppstoreUserRoleMap appstoreUserRoleMap"; private static final String[] RESTRICTIONS = {}; private AppstoreUserRoleMap appstoreUserRoleMap; private AppstoreUser appstoreUser; private AppstoreUserRole appstoreUserRole; public AppstoreUserRoleMapList() { appstoreUserRoleMap = new AppstoreUserRoleMap(); appstoreUserRoleMap.setId( new AppstoreUserRoleMapId() ); setEjbql(EJBQL); setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS)); setMaxResults(25); appstoreUser = new AppstoreUser(); appstoreUser.setId( appstoreUserRoleMap.getId().getUserId() ); appstoreUserRole = new AppstoreUserRole(); appstoreUserRole.setId( appstoreUserRoleMap.getId().getRoleId() ); } public AppstoreUserRoleMap getAppstoreUserRoleMap() { return appstoreUserRoleMap; } public List<SelectItem> getUsers() { setEjbql( EJBQL ); List<SelectItem> items = new ArrayList<SelectItem>(); for( AppstoreUserRoleMap urm : getResultList() ) { urm.getAppstoreUser().setId( urm.getId().getUserId() ); SelectItem item = new SelectItem(); item.setValue( urm.getId().getUserId() ); item.setLabel( urm.getAppstoreUser().getUsername() ); items.add( item ); } return items; } }
And here is my edit page.xml and xhtml files...
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ice="http://www.icesoft.com/icefaces/component" template="layout/template.xhtml"> <ui:define name="body"> <ice:form id="appstoreUserRoleMap" styleClass="edit"> <ice:panelGroup id="editappstoreUserRoleMapGroupId" styleClass="formBorderHighlight"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="iceDatTblColHdr2"> <ice:outputText id="editTextBoxId" value="#{appstoreUserRoleMapHome.managed ? 'Edit' : 'Add'} Role Assignment"/> </td> </tr> </table> <ice:panelGroup id="editPanelGroupId" styleClass="edit"> <s:decorate id="roleIdField" template="layout/edit.xhtml"> <ui:define name="label">Role</ui:define> <ice:selectOneMenu id="roleId" value="#{appstoreUserRoleMapHome.appstoreUserRoleMapId.roleId}" partialSubmit="true" valueChangeListener="#{appstoreUserRoleMapHome.ValueChangeListener}"> <f:selectItems value="#{appstoreUserRoleList.roles}"/> </ice:selectOneMenu> </s:decorate> <s:decorate id="userIdField" template="layout/edit.xhtml"> <ui:define name="label">User</ui:define> <ice:selectOneMenu id="userId" value="#{appstoreUserRoleMapHome.appstoreUserRoleMapId.userId}" partialSubmit="true" valueChangeListener="#{appstoreUserRoleMapHome.ValueChangeListener}"> <f:selectItems value="#{appstoreUserList.users}"/> </ice:selectOneMenu> </s:decorate> </ice:panelGroup> </ice:panelGroup> <div class="actionButtons"> <ice:commandButton id="save" value="Save" action="#{appstoreUserRoleMapHome.persist}" disabled="#{!appstoreUserRoleMapHome.wired}" rendered="#{!appstoreUserRoleMapHome.managed}"/> <ice:commandButton id="update" value="Update" action="#{appstoreUserRoleMapHome.update}" rendered="#{appstoreUserRoleMapHome.managed}"/> <ice:commandButton id="delete" value="Delete" action="#{appstoreUserRoleMapHome.remove}" immediate="true" rendered="#{appstoreUserRoleMapHome.managed}"/> <s:button id="cancelEdit" styleClass="iceCmdBtn" value="Cancel" propagation="end" view="/AppstoreUserRoleMap.xhtml" rendered="#{appstoreUserRoleMapHome.managed}"/> <s:button id="cancelAddappstoreUserRoleMapHome" styleClass="iceCmdBtn" value="Cancel" propagation="end" view="/#{empty appstoreUserRoleMapFrom ? 'AppstoreUserRoleMapList' : appstoreUserRoleMapFrom}.xhtml" rendered="#{!appstoreUserRoleMapHome.managed}"/> </div> </ice:form> <ice:form id="form2appstoreUserRoleMapHome"> <ice:panelTabSet id="editPanelTabappstoreUserRoleMapHomeId" styleClass="componentPanelTabSetLayout" style="margin-bottom:5px;margin-top:10px;"> <ice:panelTab id="editTabappstoreUserId" label="User Details" > <div class="association" id="appstoreUserParent"> <h:outputText id="editappstoreUserTextId" value="The user has not been defined. Please select a user from the drop down menu." rendered="#{appstoreUserRoleMapHome.instance.appstoreUser == null}"/> <ice:dataTable var="appstoreUser" value="#{appstoreUserRoleMapHome.instance.appstoreUser}" rendered="#{appstoreUserRoleMapHome.instance.appstoreUser != null}" rowClasses="rvgRowOne,rvgRowTwo" columnClasses="allCols" id="editappstoreUserTableId"> <ice:column id="$editColumnusernameId"> <f:facet name="header">Username</f:facet> #{appstoreUser.username} </ice:column> <ice:column id="$editColumnpasswordId"> <f:facet name="header">Password</f:facet> #{appstoreUser.password} </ice:column> <ice:column id="$editColumncreatedId"> <f:facet name="header">Created</f:facet> #{appstoreUser.created} </ice:column> <ice:column id="$editColumnlastLoginId"> <f:facet name="header">Last login</f:facet> #{appstoreUser.lastLogin} </ice:column> <ice:column id="$editColumnapiKeyId"> <f:facet name="header">API Key</f:facet> #{appstoreUser.apiKey} </ice:column> <ice:column id="$editColumnapiEnabledId"> <f:facet name="header">API Enabled</f:facet> #{appstoreUser.apiEnabled} </ice:column> <ice:column id="editColumnappstoreUserLinkId"> <f:facet name="header">Action</f:facet> <s:link view="/AppstoreUser.xhtml" id="viewappstoreUser" value="View" propagation="none"> <f:param name="appstoreUserId" value="#{appstoreUser.id}"/> </s:link> </ice:column> </ice:dataTable> </div> </ice:panelTab> <ice:panelTab id="editTabappstoreUserRoleId" label="Role Details" > <div class="association" id="appstoreUserRoleParent"> <h:outputText id="editappstoreUserRoleTextId" value="The role has not been defined. Please select a role from the drop down menu." rendered="#{!appstoreUserRoleMapHome.wired}"/> <ice:dataTable var="appstoreUserRole" value="#{appstoreUserRoleMapHome.instance.appstoreUserRole}" rendered="#{appstoreUserRoleMapHome.wired or appstoreUserRoleMapHome.managed}" rowClasses="rvgRowOne,rvgRowTwo" columnClasses="allCols" id="editappstoreUserRoleTableId"> <ice:column id="$editColumnnameId"> <f:facet name="header">Name</f:facet> #{appstoreUserRole.name} </ice:column> <ice:column id="$editColumndescriptionId"> <f:facet name="header">Description</f:facet> #{appstoreUserRole.description} </ice:column> <ice:column id="editColumnappstoreUserRoleLinkId"> <f:facet name="header">Action</f:facet> <s:link view="/AppstoreUserRole.xhtml" id="viewappstoreUserRole" value="View" propagation="none"> <f:param name="appstoreUserRoleId" value="#{appstoreUserRole.id}"/> </s:link> </ice:column> </ice:dataTable> </div> </ice:panelTab> </ice:panelTabSet> </ice:form> </ui:define> </ui:composition> <?xml version="1.0" encoding="UTF-8"?> <page xmlns="http://jboss.com/products/seam/pages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd" no-conversation-view-id="/AppstoreUserRoleMapList.xhtml" login-required="true"> <begin-conversation join="true" flush-mode="MANUAL"/> <action execute="#{appstoreUserRoleMapHome.wire}"/> <param name="appstoreUserRoleMapFrom"/> <param name="appstoreUserRoleMapRoleId" value="#{appstoreUserRoleMapHome.appstoreUserRoleMapId.roleId}"/> <param name="appstoreUserRoleMapUserId" value="#{appstoreUserRoleMapHome.appstoreUserRoleMapId.userId}"/> <param name="appstoreUserFrom"/> <param name="appstoreUserId" value="#{appstoreUserHome.appstoreUserId}"/> <param name="appstoreUserRoleFrom"/> <param name="appstoreUserRoleId" value="#{appstoreUserRoleHome.appstoreUserRoleId}"/> <navigation from-action="#{appstoreUserRoleMapHome.persist}"> <rule if-outcome="persisted"> <end-conversation/> <redirect view-id="/AppstoreUserRoleMap.xhtml"/> </rule> </navigation> <navigation from-action="#{appstoreUserRoleMapHome.update}"> <rule if-outcome="updated"> <end-conversation/> <redirect view-id="/AppstoreUserRoleMap.xhtml"/> </rule> </navigation> <navigation from-action="#{appstoreUserRoleMapHome.remove}"> <rule if-outcome="removed"> <end-conversation/> <redirect view-id="/AppstoreUserRoleMapList.xhtml"/> </rule> </navigation> </page>
Any ideas? Thanks!