[Hibernate-JIRA] Commented: (HV-19) Consider higher level validations, such as email, URL, credit card, etc.
by Ted Bergeron (JIRA)
[ http://opensource.atlassian.com/projects/hibernate/browse/HV-19?page=com.... ]
Ted Bergeron commented on HV-19:
--------------------------------
I've been reviewing the HTML5 spec and they document validation strategy for Email and URL. They also note that they specifically violate prior definitions with good reason. This seems like the right spec to adhere to as web apps will be using input type="email" and type="url" binding to fields marked @Email and @URL in the validator.
* http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the...
"A valid e-mail address is a string that matches the ABNF production 1*( atext / "." ) "@" ldh-str 1*( "." ldh-str ) where atext is defined in RFC 5322 section 3.2.3, and ldh-str is defined in RFC 1034 section 3.5. [ABNF] [RFC5322] [RFC1034]
This requirement is a willful violation of RFC 5322, which defines a syntax for e-mail addresses that is simultaneously too strict (before the "@" character), too vague (after the "@" character), and too lax (allowing comments, white space characters, and quoted strings in manners unfamiliar to most users) to be of practical use here."
* http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#val...
"The term "URL" in this specification is used in a manner distinct from the precise technical meaning it is given in RFC 3986. Readers familiar with that RFC will find it easier to read this specification if they pretend the term "URL" as used herein is really called something else altogether. This is a willful violation of RFC 3986. [RFC3986]"
> Consider higher level validations, such as email, URL, credit card, etc.
> ------------------------------------------------------------------------
>
> Key: HV-19
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HV-19
> Project: Hibernate Validator
> Issue Type: New Feature
> Components: legacy
> Reporter: Ted Bergeron
> Priority: Minor
> Fix For: 3.2.0
>
>
> I was looking at the release notes for commons validator 1.2 http://wiki.apache.org/jakarta-commons/ValidatorVersion120 and wondered if the higher level constructs fit the design goals of hibernate validator.
> They have email, URL, Credit card and ISBN. These could all be handled via @Pattern with regex matching a constant declared somewhere.
> Would it be desirable to have Hibernate supply the values for these constants? Such as:
> @Pattern(type="email") or @Pattern(regex=org.hibernate.validator.Pattern.EMAIL) or @Email
> Email and URL are global patterns. This probably wouldn't work for something like phone number which is locale sensitive.
--
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
16 years, 3 months
[Hibernate-JIRA] Created: (EJB-343) exception trying to load entity with idClass - 'id column not in any table'
by Adam Hardy (JIRA)
exception trying to load entity with idClass - 'id column not in any table'
---------------------------------------------------------------------------
Key: EJB-343
URL: http://opensource.atlassian.com/projects/hibernate/browse/EJB-343
Project: Hibernate Entity Manager
Issue Type: Bug
Components: EntityManager
Reporter: Adam Hardy
Hibernate EntityManager won't map an id-class for an entity. I have ust one entity with an inner class as the idClass.
Hibernate refuses to load the entity, throwing the following exception (see further down).
I am using hibernate-annotations-3.3.0ga and hibernate-entitymanager-3.3.1ga.
Mapping:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<schema>DEV</schema>
<entity class="org.permacode.HabitatSpeciesLink" access="FIELD">
<table name="HABITAT_SPECIES_LINK" />
<id-class
class="org.permacode.HabitatSpeciesLink$HabitatSpeciesLinkId" />
<attributes>
<id name="habitatId">
<column name="HABITAT_ID" />
</id>
<id name="speciesId">
<column name="SPECIES_ID" />
</id>
</attributes>
</entity>
</entity-mappings>
This is the entity code:
public class HabitatSpeciesLink implements Serializable
{
private static final long serialVersionUID = -7079021236893433038L;
private Long habitatId;
private Long speciesId;
public static class HabitatSpeciesLinkId implements Serializable
{
//private static final long serialVersionUID = 6224703642788723112L;
private Long habitatId;
private Long speciesId;
public Long getHabitatId()
{
return this.habitatId;
}
public void setHabitatId(Long newHabitatId)
{
this.habitatId = newHabitatId;
}
public Long getSpeciesId()
{
return this.speciesId;
}
public void setSpeciesId(Long newSpeciesId)
{
this.speciesId = newSpeciesId;
}
public boolean equals(Object other)
{
if (other == this)
return true;
if (!(other instanceof HabitatSpeciesLinkId))
return false;
HabitatSpeciesLinkId mi = (HabitatSpeciesLinkId) other;
return (habitatId == mi.habitatId || (habitatId != null && habitatId
.equals(mi.habitatId)))
&& (speciesId == mi.speciesId || (speciesId != null && speciesId
.equals(mi.speciesId)));
}
public int hashCode()
{
return ((habitatId == null) ? 0
: habitatId.hashCode()) ^ ((speciesId == null) ? 0
: speciesId.hashCode());
}
public String toString()
{
return "habitatId[" + habitatId + "],speciesId[" + speciesId + "]";
}
}
public Long getHabitatId()
{
return this.habitatId;
}
public void setHabitatId(Long newHabitatId)
{
this.habitatId = newHabitatId;
}
public Long getSpeciesId()
{
return this.speciesId;
}
public void setSpeciesId(Long newSpeciesId)
{
this.speciesId = newSpeciesId;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((this.getHabitatId() == null) ? 0
: this.getHabitatId().hashCode());
result = prime * result + ((this.getSpeciesId() == null) ? 0
: this.getSpeciesId().hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof HabitatSpeciesLink))
return false;
final HabitatSpeciesLink other = (HabitatSpeciesLink) obj;
if (this.getHabitatId() == null)
{
if (other.getHabitatId() != null)
return false;
}
else if (!this.getHabitatId().equals(other.getHabitatId()))
return false;
if (this.getSpeciesId() == null)
{
if (other.getSpeciesId() != null)
return false;
}
else if (!this.getSpeciesId().equals(other.getSpeciesId()))
return false;
return true;
}
}
This is the test code:
EntityManager entityManager = entityManagerFactory.createEntityManager();
HabitatSpeciesLink.HabitatSpeciesLinkId id = new HabitatSpeciesLink.HabitatSpeciesLinkId();
id.setHabitatId(new Long(123));
id.setSpeciesId(new Long(234));
HabitatSpeciesLink entity = entityManager.find(HabitatSpeciesLink.class, id);
Assert.assertNotNull("should have entity with composite key", entity);
Here's the stacktrace:
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not load an entity: [org.permacode.HabitatSpeciesLink#component[habitatId,speciesId]{habitatId=123, speciesId=234}]
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:195)
at org.permacode.BugCompositeKeyTest.testCompositeKey(BugCompositeKeyTest.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.hibernate.exception.SQLGrammarException: could not load an entity: [org.permacode.HabitatSpeciesLink#component[habitatId,speciesId]{habitatId=123, speciesId=234}]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1865)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2992)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:175)
... 23 more
Caused by: java.sql.SQLException: Column 'HABITATSPE0_.HABITATID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'HABITATSPE0_.HABITATID' is not a column in the target table.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
at org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:497)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:415)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1538)
at org.hibernate.loader.Loader.doQuery(Loader.java:661)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1851)
... 35 more
Caused by: ERROR 42X04: Column 'HABITATSPE0_.HABITATID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'HABITATSPE0_.HABITATID' is not a column in the target table.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.sql.compile.ColumnReference.bindExpression(Unknown Source)
at org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(Unknown Source)
at org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.SelectNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown Source)
at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
... 48 more
I'm using Derby, Hypersonic, H2 or postgresql. It seems to be database-independent.
This is the generated SQL:
select habitatspe0_.habitatId as habitatId0_0_, habitatspe0_.speciesId as speciesId0_0_ from DEV.HABITAT_SPECIES_LINK habitatspe0_ where habitatspe0_.habitatId=? and habitatspe0_.speciesId=?
--
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
16 years, 3 months
[Hibernate-JIRA] Created: (ANN-685) Hibernate does not honor @Column(name=...) annotation with IdClass
by Steve Devore (JIRA)
Hibernate does not honor @Column(name=...) annotation with IdClass
------------------------------------------------------------------
Key: ANN-685
URL: http://opensource.atlassian.com/projects/hibernate/browse/ANN-685
Project: Hibernate Annotations
Issue Type: Bug
Affects Versions: 3.2.1
Environment: Hibernate 3.2.1, JBoss 4.0.4
Reporter: Steve Devore
When an Entity uses an IdClass, any query will fail fails because it is using the name of the attribute instead of the one indicated by the @Column annotation. It fails because it is looking for the annotations of the IdClass instead of the main class.
Please see the following example:
The IdClass is defined as follows:
public class DomainAdminId implements Serializable {
private String domainName;
private String adminUser;
public DomainAdminId() {
}
public DomainAdminId(String domainName, String adminUser) {
this.domainName = domainName;
this.adminUser = adminUser;
}
public String getDomainName() {
return domainName;
}
public void setDomainName(String domainName) {
this.domainName = domainName;
}
public String getAdminUser() {
return adminUser;
}
public void setAdminUser(String adminUser) {
this.adminUser = adminUser;
}
public boolean equals(Object o) {
return ((o instanceof DomainAdminId) &&
domainName.equals(((DomainAdminId)o).getDomainName()) &&
adminUser.equals(((DomainAdminId)o).getAdminUser()));
}
public int hashCode() {
return (domainName+adminUser).hashCode();
}
}
And the following Entity using that idClass:
@Entity
@Table(name="domainadmin")
@IdClass(DomainAdminId.class)
@NamedQueries( {
@NamedQuery(name = "DomainAdmin.test", query = "SELECT d FROM DomainAdmin d")
)
public class DomainAdmin implements Serializable {
@Id
@Column(name="domain_name")
private String domainName;
@Id
@Column(name="adminuser")
private String adminUser;
public DomainAdmin() {
}
public String getDomainName() {
return domainName;
}
public void setDomainName(String domainName) {
this.domainName = domainName;
}
public String getAdminUser() {
return adminUser;
}
public void setAdminUser(String adminUser) {
this.adminUser = adminUser;
}
}
When executing the DomainAdmin.test Named Query I got this error:
could not execute query [select domainadmi0_.adminUser as adminUser1_, domainadmi0_.domainName as domainName1_ from domainadmin domainadmi0_]
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'domainadmi0_.domainName' in 'field list'
In effect, as indicated in the source, the column name is "domain_name" and not "domainName".
The same apply for the other column: adminUser (that should instead be "adminuser"),
Workaround:
If the @Column annotation is put on the IdClass it will work sucessfully. However, this should not be necessary.
--
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
16 years, 3 months
[Hibernate-JIRA] Created: (HHH-4093) Tutorial Project to illustrate use of Hibernate using Annotations and additionally provide Unit Testing for Support for PostgreSQL UUID data type
by David Driscoll (JIRA)
Tutorial Project to illustrate use of Hibernate using Annotations and additionally provide Unit Testing for Support for PostgreSQL UUID data type
-------------------------------------------------------------------------------------------------------------------------------------------------
Key: HHH-4093
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4093
Project: Hibernate Core
Issue Type: Improvement
Components: documentation
Environment: Hibernate 3.5.0 (Trunk), Postgresql 8.3 or greater
Reporter: David Driscoll
Attachments: hibernate-tutorials-annotations.zip
Ran into issue HH-3579, and needed support for Uuid type in Postgresql.
I have create patches for HH-3579, so that Hibernate now support the Uuid type in Postgresql.
I created this project (attached as zip) to be able to Unit Test these patches in a web application environment using Unit Tests via JUnit 4.
Here is an excerpt from the readme file in this project:
This project was created for the main purpose of unit testing a Hibernate enhancement (HH-3579)
that added uuid sql types to hibernate. Specifically, for unit testing against Postgresql 8.3 or greater
which allows uuid data types. Additionally, it demonstrates how to use Hibernate with Annotations.
This tutorial implements a basic web application using Hibernate 3.5 (trunk), Spring Framework 3.0 (trunk), Spring's MVC, and Atomikos Transaction Manager 3.5.5.
--
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
16 years, 3 months
[Hibernate-JIRA] Created: (HHH-4050) yes_no type is broken
by David J. M. Karlsen (JIRA)
yes_no type is broken
---------------------
Key: HHH-4050
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4050
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.2.7
Environment: Windows XP
DB2 9.5
Hibernate 3.2.7
Reporter: David J. M. Karlsen
The yes_no usertype seems broken.
Stacktrace:
Caused by: java.lang.ClassCastException: java.lang.String incompatible with java.lang.Boolean
at org.hibernate.type.CharBooleanType.toCharacter(CharBooleanType.java:44)
at org.hibernate.type.CharBooleanType.set(CharBooleanType.java:35)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:116)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:44)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:491)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1567)
at org.hibernate.loader.Loader.doQuery(Loader.java:673)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2217)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2108)
at org.hibernate.loader.Loader.list(Loader.java:2103)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:340)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1122)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at org.springframework.orm.hibernate3.HibernateTemplate$31.doInHibernate(HibernateTemplate.java:956)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedParam(HibernateTemplate.java:947)
There is a cast to Boolean, but the actual argument is the string.
Mapping configuration:
<property name="myProperty" type="org.hibernate.type.YesNoType" length="1" column="SDDBA_DEBTOR_ALL_ACCOUNTS_IND" not-null="true" />
The column is declared as char(1) not null
--
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
16 years, 3 months