EntityHome and h:selectManyCheckbox problem
gregtk Nov 16, 2008 4:18 PMHello, guys!!! I can't persist/update checked items with EntityHome. I try to debug but it's doesn't help.
my settings
components.xml
<framework:entity-query name="all_groups" ejbql="select g from ClientGroup g where g.deleted = false order by g.name" scope="conversation"/>
my Entities
@Entity
@Table(name = "CLIENTS")
public class Client implements Serializable {
private Long id;
private String surname;
private String name;
private String patronymic;
private String email;
private List<ClientGroup> clientGroups;
private boolean subscribed;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPatronymic() {
return patronymic;
}
public void setPatronymic(String patronymic) {
this.patronymic = patronymic;
}
@Email
@NotNull
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "clients", fetch = FetchType.LAZY)
public List<ClientGroup> getClientGroups() {
return clientGroups;
}
public void setClientGroups(List<ClientGroup> clientGroups) {
this.clientGroups = clientGroups;
}
public boolean isSubscribed() {
return subscribed;
}
public void setSubscribed(boolean subscribed) {
this.subscribed = subscribed;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Client client = (Client) o;
if (subscribed != client.subscribed) return false;
if (clientGroups != null ? !clientGroups.equals(client.clientGroups) : client.clientGroups != null)
return false;
if (email != null ? !email.equals(client.email) : client.email != null) return false;
if (id != null ? !id.equals(client.id) : client.id != null) return false;
if (name != null ? !name.equals(client.name) : client.name != null) return false;
if (patronymic != null ? !patronymic.equals(client.patronymic) : client.patronymic != null) return false;
if (surname != null ? !surname.equals(client.surname) : client.surname != null) return false;
return true;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (surname != null ? surname.hashCode() : 0);
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (patronymic != null ? patronymic.hashCode() : 0);
result = 31 * result + (email != null ? email.hashCode() : 0);
result = 31 * result + (clientGroups != null ? clientGroups.hashCode() : 0);
result = 31 * result + (subscribed ? 1 : 0);
return result;
}
}
@Entity
@Table(name = "CLIENT_GROUP")
@NamedQueries({
@NamedQuery(name = "findAllgroups", query = "select g from ClientGroup g where g.deleted = false order by g.name ")
})
public class ClientGroup implements Serializable {
private Long id;
private String name;
private List<Client> clients;
private boolean deleted;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "CLIENTS_TO_GROUPS",
joinColumns = @JoinColumn(name = "GROUP_ID"),
inverseJoinColumns = @JoinColumn(name = "CLIENT_ID"))
public List<Client> getClients() {
return clients;
}
public void setClients(List<Client> clients) {
this.clients = clients;
}
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
}
my EntityHome
@Name("clientHome")
public class ClientHome extends EntityHome<Client> {
@In
EntityManager entityManager;
@Logger
Log log;
public EntityManager getEntityManager() {
return entityManager;
}
@Factory("editClient")
public Client initClient() {
return getInstance();
}
@RequestParameter
public void setClientId(Long id) throws NewsNotFoundException {
if (id != null) {
try {
Client entity = entityManager.find(Client.class, id);
if (entity != null)
setId(id);
} catch (Exception ex) {
log.error("client not found");
}
}
}
@Override
public Expressions.ValueExpression getCreatedMessage() {
return createValueExpression("#{messages['client.created']}");
}
@Override
public Expressions.ValueExpression getUpdatedMessage() {
return createValueExpression("#{messages['client.updated']}");
}
@Override
public String update() {
return super.update();
}
}
my view
<!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:rich="http://richfaces.org/rich"
template="layout/template.xhtml">
<ui:define name="body">
<h:messages id="messages" globalOnly="true" styleClass="message"
errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg"
rendered="#{showGlobalMessages != 'false'}"/>
<h1>
<h:outputText rendered="#{clientHome.managed}" value="#{messages['client.edit']}"/>
<h:outputText rendered="#{!clientHome.managed}" value="#{messages['client.create']}"/>
</h1>
<h:form id="editClient">
<h:panelGrid columns="2">
<h:outputText styleClass="manage-form" value="#{messages['client.surname']}"/>
<h:inputText id="surname" value="#{editClient.surname}" size="30"/>
<h:outputText styleClass="manage-form" value="#{messages['client.name']}"/>
<h:inputText id="name" value="#{editClient.name}" size="30"/>
<h:outputText styleClass="manage-form" value="#{messages['client.patronymic']}"/>
<h:inputText id="patronymic" value="#{editClient.patronymic}" size="30"/>
<h:outputText styleClass="manage-form" value="#{messages['client.email']}"/>
<h:inputText id="email" value="#{editClient.email}" size="30"/>
<h:outputText styleClass="manage-form" value="#{messages['label.groups']}"/>
<h:selectManyCheckbox value="#{editClient.clientGroups}" layout="PAGE_DIRECTION">
<s:selectItems value="#{all_groups.resultList}"
var="group"
label="#{group.name}"/>
<s:convertEntity/>
</h:selectManyCheckbox>
<h:outputText styleClass="manage-form" value="#{messages['client.subscribed']}"/>
<h:selectBooleanCheckbox value="#{editClient.subscribed}"/>
</h:panelGrid>
<br/>
<rich:separator/>
<h:commandButton rendered="#{not clientHome.managed}" value="#{messages['button.save']}"
action="#{clientHome.persist}"/>
<h:commandButton rendered="#{clientHome.managed}" value="#{messages['button.update']}"
action="#{clientHome.update}"/>
</h:form>
</ui:define>
</ui:composition>
When I select some items and press update/create it gave my select items to EntityHome but after persist/update nothing happens in db, for other fields of Client entity everything ok.
I use JBoss SEAM 2.1 and JBoss AS 4.2.2.