Earlier today, I was writing some unit tests and stumbled onto a strange
problem with some existing code we have. A result is getting returned
for something that does not exist in the database.
I've included the method that's getting called below. Given a specific
input, we get a valid object even though there is nothing close to it.
We have a system with a "publications" table and a publication editions
table. The latter is an instance of a publication typically used when
we have a newsletter from a specific date. If we use today's date and a
publication name we'll call A, we get a PublicationEditions object for
publication B on a different date from last year. The primary key is
different as is all the other meta data for the PublicationEditions
object (a cayenne generated class).
The only possibility I've come up with is that there is some hash used
in the system and we happened to hit a collision. Is this a
possibility? We've been using Cayenne's LRU algorithm, but I've tried
switching to oscache today as well with the same results (also LRU).
Lucas Holt
public com.prime.pcd.db.PublicationEditions lookup(final String
publicationName, final Date date)
throws IllegalArgumentException, ModelException {
com.prime.pcd.db.PublicationEditions pe = null;
if (publicationName == null || publicationName.length() > 255
|| publicationName.length() < 1) {
throw new IllegalArgumentException("Invalid publication name");
}
if (date == null) {
throw new IllegalArgumentException("Invalid date");
}
try {
Expression qualifier =
Expression.fromString("publicationEditionsPublication.publicationName =
$pn and publicationEditionDate=$date");
final HashMap<String, Object> map = new HashMap<String,
Object>(2);
map.put("pn", publicationName);
map.put("date", date);
qualifier = qualifier.expWithParameters(map);
final SelectQuery query = new
SelectQuery(com.prime.pcd.db.PublicationEditions.class, qualifier);
final List<com.prime.pcd.db.PublicationEditions> editions =
dataContext.performQuery(query);
logger.debug( "Number of found items is " + editions.size());
if (!editions.isEmpty()) {
pe = editions.get(0);
logger.debug(pe.getPublicationEditionsId() + ", " +
pe.getPublicationEditionsPublication().getPublicationName());
}
} catch (CayenneRuntimeException ce) {
logger.error("Cayenne error looking up edition: " +
ce.getMessage());
throw new ModelException("Could not lookup edition");
}
return pe;
}
This archive was generated by hypermail 2.0.0 : Fri Jun 18 2010 - 20:15:51 UTC