[Hibernate-JIRA] Created: (HHH-3771) Best pactice for equals implementation?
by Samppa Saarela (JIRA)
Best pactice for equals implementation?
---------------------------------------
Key: HHH-3771
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3771
Project: Hibernate Core
Issue Type: New Feature
Components: core, documentation
Reporter: Samppa Saarela
When domain model contains even one lazy reference to an object, default equals fails when it's compared to a) the actual implementation returned by Session.get/load or b) other proxies (at least of different supertype). Overriding equals on a class that uses surrogate id is not that simple. However there is a simple solution to this problem:
In domain class, override equals like this:
public boolean equals(Object obj) {
return this == getImplementation(obj);
}
public static Object getImplementation(Object obj) {
if (obj instanceof HibernateProxy) {
return ((HibernateProxy) obj).getHibernateLazyInitializer().getImplementation();
} else {
return obj;
}
}
This should result always in comparing object references of actual instances and thus preserve symmetry.
It's understandable that you don't wan to publish that kind of getImplementation utility e.g. in Hibernate, but maybe you could support this more directly by implementing
Hibernate.equals(Object o1, Object o2)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
15 years, 9 months
[Hibernate-JIRA] Created: (HHH-5097) Bug in ParameterizedFunctionExpression with two or more parameters: IllegalArgumentException
by Max Hartmann (JIRA)
Bug in ParameterizedFunctionExpression with two or more parameters: IllegalArgumentException
--------------------------------------------------------------------------------------------
Key: HHH-5097
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5097
Project: Hibernate Core
Issue Type: Bug
Components: entity-manager
Affects Versions: 3.5.0-Final
Environment: oracle 10g, hibernate 3.5
Reporter: Max Hartmann
If you call CriteriaBuilder.function() respectively "ParameterizedFunctionExpression" with two or more arguments you get an IllegalArgumentException.
I think the bug is here:
protected void renderArguments(StringBuilder buffer, CriteriaQueryCompiler.RenderingContext renderingContext) {
for ( Expression argument : argumentExpressions ) {
buffer.append( ( (Renderable) argument ).render( renderingContext ) );
}
}
The arguments are not seperated by comma.
Exception:
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: : near line 1, column 37 [select TO_CHAR(generatedAlias0.date1:param0) from test.server.TestBean as generatedAlias0]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1166)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1112)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:315)
at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:154)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:432)
at test.server.TestApp.main(TestApp.java:28)
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: : near line 1, column 37 [select TO_CHAR(generatedAlias0.date1:param0) from test.server.TestBean as generatedAlias0]
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:297)
... 3 more
Code:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("userDatabase");
EntityManager em = factory.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> createQuery = cb.createQuery(String.class);
Root<TestBean> from = createQuery.from(TestBean.class);
Expression<String> param = cb.literal("DD.MM.YYYY");
createQuery.select(cb.function("TO_CHAR", String.class,
from.get(TestBean_.date1), param));
List<String> resultList = em.createQuery(createQuery).getResultList();
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
15 years, 9 months