Author: epbernard
Date: 2006-09-05 12:49:05 -0400 (Tue, 05 Sep 2006)
New Revision: 10452
Added:
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/State.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/StateType.java
Modified:
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
Log:
ANN-181 do not raise unresolved type exception if a @Type is defined
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
---
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-09-05
06:53:46 UTC (rev 10451)
+++
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-09-05
16:49:05 UTC (rev 10452)
@@ -942,7 +942,7 @@
log.debug( "Processing " + propertyHolder.getEntityName() + " " +
accessType + " annotation" );
List<XProperty> properties = annotatedClass.getDeclaredProperties( accessType );
for ( XProperty p : properties ) {
- if ( !p.isTypeResolved() && !hasExplicitTargetEntity( p ) &&
!mustBeSkipped( p, mappings ) ) {
+ if ( !p.isTypeResolved() && !discoverTypeWithoutReflection( p ) &&
!mustBeSkipped( p, mappings ) ) {
throw new IllegalStateException(
"Property " + p + " has an unbound type and no explicit target
entity."
);
@@ -953,7 +953,7 @@
return hasIdentifier;
}
- private static boolean hasExplicitTargetEntity(XProperty p) {
+ private static boolean discoverTypeWithoutReflection(XProperty p) {
if ( p.isAnnotationPresent( OneToOne.class ) && !p.getAnnotation(
OneToOne.class )
.targetEntity()
.equals( void.class ) ) {
@@ -974,6 +974,9 @@
.equals( void.class ) ) {
return true;
}
+ if (p.isAnnotationPresent( Type.class ) ) {
+ return true;
+ }
return false;
}
Modified:
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java
===================================================================
---
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-09-05
06:53:46 UTC (rev 10451)
+++
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-09-05
16:49:05 UTC (rev 10452)
@@ -31,7 +31,6 @@
}
public XClass getSuperclass() {
- //FIXME we do not pass the class TypeEnvironment here
//return getFactory().toXClass( toClass().getSuperclass(),
getFactory().getTypeEnvironment( toClass() ) );
return getFactory().toXClass( toClass().getSuperclass(),
new CompoundTypeEnvironment( getTypeEnvironment(), getFactory().getTypeEnvironment(
toClass() )
@@ -45,7 +44,7 @@
XClass[] xClasses = new XClass[length];
//TypeEnvironment environment = getFactory().getTypeEnvironment( toClass() );
TypeEnvironment environment =
- new CompoundTypeEnvironment( getTypeEnvironment(), getFactory().getTypeEnvironment(
toClass() ) );
+ new CompoundTypeEnvironment( getTypeEnvironment(), getFactory().getTypeEnvironment(
toClass() ) );
for ( int index = 0; index < length ; index++ ) {
xClasses[index] = getFactory().toXClass( classes[index], environment );
}
Modified:
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java
===================================================================
---
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java 2006-09-05
06:53:46 UTC (rev 10451)
+++
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/Gene.java 2006-09-05
16:49:05 UTC (rev 10452)
@@ -5,14 +5,26 @@
import javax.persistence.Id;
import javax.persistence.ManyToOne;
+import org.hibernate.annotations.Type;
+
/**
* @author Paolo Perrotta
*/
@Entity
-public class Gene<T> {
+public class Gene<T, STE extends Enum> {
private Integer id;
+ private STE state;
+ @Type(type="org.hibernate.test.annotations.generics.StateType")
+ public STE getState() {
+ return state;
+ }
+
+ public void setState(STE state) {
+ this.state = state;
+ }
+
@Id
@GeneratedValue
public Integer getId() {
Added:
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/State.java
===================================================================
---
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/State.java 2006-09-05
06:53:46 UTC (rev 10451)
+++
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/State.java 2006-09-05
16:49:05 UTC (rev 10452)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.generics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum State {
+ ACTIVE,
+ DORMANT
+}
Added:
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/StateType.java
===================================================================
---
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/StateType.java 2006-09-05
06:53:46 UTC (rev 10451)
+++
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/StateType.java 2006-09-05
16:49:05 UTC (rev 10452)
@@ -0,0 +1,69 @@
+//$Id: $
+package org.hibernate.test.annotations.generics;
+
+import java.io.Serializable;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.Types;
+
+import org.hibernate.usertype.UserType;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StateType implements UserType {
+ public int[] sqlTypes() {
+ return new int[] {
+ Types.INTEGER
+ };
+ }
+
+ public Class returnedClass() {
+ return State.class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ return x == y;
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws
HibernateException, SQLException {
+ int result = rs.getInt( names[0] );
+ if ( rs.wasNull() ) return null;
+ return State.values()[result];
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index) throws
HibernateException, SQLException {
+ if (value == null) {
+ st.setNull( index, Types.INTEGER );
+ }
+ else {
+ st.setInt( index, ( (State) value ).ordinal() );
+ }
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ return value;
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ public Object replace(Object original, Object target, Object owner) throws
HibernateException {
+ return original;
+ }
+}
Modified:
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
===================================================================
---
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2006-09-05
06:53:46 UTC (rev 10451)
+++
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2006-09-05
16:49:05 UTC (rev 10452)
@@ -19,6 +19,20 @@
s.close();
}
+ public void testAcceptsUnresolvedPropertyTypesIfATypeExplicitlySet() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Gene item = new Gene();
+ item.setState( State.DORMANT );
+ s.persist( item );
+ s.flush();
+ s.clear();
+ item = (Gene) s.get( Gene.class, item.getId() );
+ assertEquals( State.DORMANT, item.getState() );
+ tx.rollback();
+ s.close();
+ }
+
@Override
protected Class[] getMappings() {
return new Class[]{
Show replies by date