I have a JPA entity, which hibernate is proxying.
The following action works as it explicitly states the properties to
include, however what I would much rather do is use excludeProperties to
remove the problematic property. The problem property when serialized
causes a "Positioned Update not supported" exception.
The interesting thing is, all the properties on the entity class are
persisted correctly if explicitly included.
Looking in the the debugger shows there is a property called
"$JAVASSIST_READ_WRITE_HANDLER" of type FieldInterceptorImpl which
Hibernate/JPA adds to the entity. I'm pretty sure this is what is
causing it to fail.
I've tried the following:
@Action(value = "list-clients", results = {
@Result(type = "json", params = {
"excludeProperties",
"list\\[.*\\]\\.\\$JAVASSIST_READ_WRITE_HANDLER.*"
})
})
but with no luck. Following is my action and the entity class.
Here is my action (In a _working_ state):
/////////////////////////////
@ParentPackage("json-default")
@Result(type = "json")
public class ListTable extends ActionSupport {
@EJB
private ClientService clientService;
private List list;
@Action(value = "list-clients", results = {
@Result(type = "json", params = {
"includeProperties",
"list\\[.*\\]\\.name, list\\[.*\\]\\.id, list\\[.*\\]\
\.timelogCollection\\..*"
})
})
public String listClients() {
list = clientService.list();
return SUCCESS;
}
public List getList() {
return list;
}
}
/////////////////////////////
Here is the entity:
/////////////////////////////
@Entity
@Table(name = "client")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Client.findAll", query = "SELECT c FROM Client
c"),
@NamedQuery(name = "Client.findById", query = "SELECT c FROM Client
c WHERE c.id = :id"),
@NamedQuery(name = "Client.findByName", query = "SELECT c FROM
Client c WHERE c.name = :name")})
public class Client implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Integer id;
@Size(max = 45)
@Column(name = "name")
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "clientId")
private Collection<Timelog> timelogCollection;
public Client() {
}
public Client(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlTransient
public Collection<Timelog> getTimelogCollection() {
return timelogCollection;
}
public void setTimelogCollection(Collection<Timelog>
timelogCollection) {
this.timelogCollection = timelogCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id
fields are not set
if (!(object instanceof Client)) {
return false;
}
Client other = (Client) object;
if ((this.id == null && other.id != null) || (this.id != null
&& !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.aerose.kentimekeeper.db.Client[ id=" + id + " ]";
}
}
/////////////////////////////
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]