You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(22) |
Nov
(308) |
Dec
(131) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(369) |
Feb
(171) |
Mar
(236) |
Apr
(187) |
May
(218) |
Jun
(217) |
Jul
(127) |
Aug
(448) |
Sep
(270) |
Oct
(231) |
Nov
(422) |
Dec
(255) |
2004 |
Jan
(111) |
Feb
(73) |
Mar
(338) |
Apr
(351) |
May
(349) |
Jun
(495) |
Jul
(394) |
Aug
(1048) |
Sep
(499) |
Oct
(142) |
Nov
(269) |
Dec
(638) |
2005 |
Jan
(825) |
Feb
(1272) |
Mar
(593) |
Apr
(690) |
May
(950) |
Jun
(958) |
Jul
(767) |
Aug
(839) |
Sep
(525) |
Oct
(449) |
Nov
(585) |
Dec
(455) |
2006 |
Jan
(603) |
Feb
(656) |
Mar
(195) |
Apr
(114) |
May
(136) |
Jun
(100) |
Jul
(128) |
Aug
(68) |
Sep
(7) |
Oct
(1) |
Nov
(1) |
Dec
(8) |
2007 |
Jan
(4) |
Feb
(3) |
Mar
(8) |
Apr
(16) |
May
(5) |
Jun
(4) |
Jul
(6) |
Aug
(23) |
Sep
(15) |
Oct
(5) |
Nov
(7) |
Dec
(5) |
2008 |
Jan
(5) |
Feb
(1) |
Mar
(1) |
Apr
(5) |
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
(1) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
(3) |
Dec
(2) |
2013 |
Jan
(1) |
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(2) |
Jun
(1) |
Jul
|
Aug
(1) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <hib...@li...> - 2006-03-09 17:41:17
|
Author: epbernard Date: 2006-03-09 12:40:57 -0500 (Thu, 09 Mar 2006) New Revision: 9582 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java Log: EJB-106 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-09 15:50:15 UTC (rev 9581) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-09 17:40:57 UTC (rev 9582) @@ -206,9 +206,8 @@ public abstract Session getSession(); public EntityTransaction getTransaction() { - if (transactionType == PersistenceUnitTransactionType.JTA - || ! isOpen() ) { - throw new IllegalStateException( "JTA EntityManager or closed EntityManager" ); + if (transactionType == PersistenceUnitTransactionType.JTA) { + throw new IllegalStateException( "JTA EntityManager cannot access a transactions" ); } return tx; } @@ -268,8 +267,7 @@ case READ: return LockMode.UPGRADE; //assuming we are on read-commited and we need to prevent non repeteable read case WRITE: - log.warn( "LockModeType.WRITE does not increment the version number" ); - return LockMode.UPGRADE; + return LockMode.FORCE; default: throw new AssertionFailure( "Unknown LockModeType: " + lockMode ); } |
From: <hib...@li...> - 2006-03-09 15:50:33
|
Author: epbernard Date: 2006-03-09 10:50:15 -0500 (Thu, 09 Mar 2006) New Revision: 9581 Modified: trunk/Hibernate3/src/org/hibernate/LockMode.java Log: Add LockMode.FORCE to the static resolver Modified: trunk/Hibernate3/src/org/hibernate/LockMode.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/LockMode.java 2006-03-09 02:25:55 UTC (rev 9580) +++ trunk/Hibernate3/src/org/hibernate/LockMode.java 2006-03-09 15:50:15 UTC (rev 9581) @@ -93,6 +93,7 @@ INSTANCES.put( UPGRADE.name, UPGRADE ); INSTANCES.put( UPGRADE_NOWAIT.name, UPGRADE_NOWAIT ); INSTANCES.put( WRITE.name, WRITE ); + INSTANCES.put( FORCE.name, FORCE ); } private Object readResolve() { |
From: <hib...@li...> - 2006-03-09 02:25:59
|
Author: ste...@jb... Date: 2006-03-08 21:25:55 -0500 (Wed, 08 Mar 2006) New Revision: 9580 Modified: trunk/Hibernate3/test/org/hibernate/test/filter/DynamicFilterTest.java trunk/Hibernate3/test/org/hibernate/test/hql/BulkManipulationTest.java Log: oops Modified: trunk/Hibernate3/test/org/hibernate/test/filter/DynamicFilterTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/filter/DynamicFilterTest.java 2006-03-08 23:31:02 UTC (rev 9579) +++ trunk/Hibernate3/test/org/hibernate/test/filter/DynamicFilterTest.java 2006-03-09 02:25:55 UTC (rev 9580) @@ -586,8 +586,4 @@ session.close(); } } - - private SessionFactoryImplementor sfi() { - return ( SessionFactoryImplementor ) getSessions(); - } } Modified: trunk/Hibernate3/test/org/hibernate/test/hql/BulkManipulationTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/BulkManipulationTest.java 2006-03-08 23:31:02 UTC (rev 9579) +++ trunk/Hibernate3/test/org/hibernate/test/hql/BulkManipulationTest.java 2006-03-09 02:25:55 UTC (rev 9580) @@ -1141,8 +1141,4 @@ s.close(); } } - - private SessionFactoryImplementor sfi() { - return ( SessionFactoryImplementor ) getSessions(); - } } |
From: <hib...@li...> - 2006-03-08 23:31:24
|
Author: epbernard Date: 2006-03-08 18:31:02 -0500 (Wed, 08 Mar 2006) New Revision: 9579 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java Log: EJB-139 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-08 22:41:38 UTC (rev 9578) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-08 23:31:02 UTC (rev 9579) @@ -206,10 +206,10 @@ public abstract Session getSession(); public EntityTransaction getTransaction() { - //if (transactionType == PersistenceUnitTransactionType.JTA - // || ! isOpen() ) { - // throw new IllegalStateException( "JTA EntityManager or closed EntityManager" ); - //} + if (transactionType == PersistenceUnitTransactionType.JTA + || ! isOpen() ) { + throw new IllegalStateException( "JTA EntityManager or closed EntityManager" ); + } return tx; } @@ -240,7 +240,7 @@ this.flushMode = FlushModeType.COMMIT; } else if ( mode == FlushMode.NEVER ) { - if ( PersistenceContextType.EXTENDED == persistenceContextType && !getTransaction().isActive() ) { + if ( PersistenceContextType.EXTENDED == persistenceContextType && !isTransactionInProgress() ) { //we are in flushMode none for EXTENDED return flushMode; } @@ -325,7 +325,7 @@ } /** - * returns the session + * returns the underlying session */ public Object getDelegate() { return getSession(); |
Author: epbernard Date: 2006-03-08 17:41:38 -0500 (Wed, 08 Mar 2006) New Revision: 9578 Added: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityExistsException.java trunk/HibernateExt/ejb-api/src/javax/persistence/RollbackException.java Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java trunk/HibernateExt/ejb-api/src/javax/persistence/EntityNotFoundException.java trunk/HibernateExt/ejb-api/src/javax/persistence/EntityTransaction.java trunk/HibernateExt/ejb-api/src/javax/persistence/NoResultException.java trunk/HibernateExt/ejb-api/src/javax/persistence/NonUniqueResultException.java trunk/HibernateExt/ejb-api/src/javax/persistence/TransactionRequiredException.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java Log: EJB-138 EJB-90 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -12,10 +12,15 @@ import javax.persistence.EntityTransaction; import javax.persistence.FlushModeType; import javax.persistence.LockModeType; +import javax.persistence.NoResultException; +import javax.persistence.NonUniqueResultException; import javax.persistence.PersistenceContextType; +import javax.persistence.PersistenceException; import javax.persistence.Query; import javax.persistence.TransactionRequiredException; import javax.persistence.spi.PersistenceUnitTransactionType; +import javax.transaction.SystemException; +import javax.transaction.TransactionManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -29,12 +34,13 @@ import org.hibernate.Session; import org.hibernate.StaleObjectStateException; import org.hibernate.UnresolvableObjectException; +import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.engine.SessionImplementor; import org.hibernate.proxy.HibernateProxy; /** * @author <a href="mailto:ga...@hi...">Gavin King</a> - * @version $Revision$ + * @author Emmanuel Bernard */ public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable { private static Log log = LogFactory.getLog( AbstractEntityManagerImpl.class ); @@ -51,32 +57,32 @@ public Query createQuery(String ejbqlString) { adjustFlushMode(); - return new QueryImpl( getSession().createQuery( ejbqlString ) ); + return new QueryImpl( getSession().createQuery( ejbqlString ), this ); } public Query createNamedQuery(String name) { adjustFlushMode(); - return new QueryImpl( getSession().getNamedQuery( name ) ); + return new QueryImpl( getSession().getNamedQuery( name ), this ); } public Query createNativeQuery(String sqlString) { adjustFlushMode(); SQLQuery q = getSession().createSQLQuery( sqlString ); - return new QueryImpl( q ); + return new QueryImpl( q, this ); } public Query createNativeQuery(String sqlString, Class resultClass) { adjustFlushMode(); SQLQuery q = getSession().createSQLQuery( sqlString ); q.addEntity( "alias1", resultClass.getName(), LockMode.READ ); - return new QueryImpl( q ); + return new QueryImpl( q, this ); } public Query createNativeQuery(String sqlString, String resultSetMapping) { adjustFlushMode(); SQLQuery q = getSession().createSQLQuery( sqlString ); q.setResultSetMapping( resultSetMapping ); - return new QueryImpl( q ); + return new QueryImpl( q, this ); } public <T> T getReference(Class<T> entityClass, Object primaryKey) { @@ -86,7 +92,8 @@ return rtn; } catch (ObjectNotFoundException e) { - throw new EntityNotFoundException( e.getMessage(), e ); + throwPersistenceException( new EntityNotFoundException( e.getMessage(), e ) ); + return null; //for the compiler to stop complaining } catch (MappingException e) { throw new IllegalArgumentException( e.getMessage(), e ); @@ -115,8 +122,11 @@ } private void checkTransactionNeeded() { - if ( ! isTransactionInProgress() && persistenceContextType == PersistenceContextType.TRANSACTION ) { - throw new TransactionRequiredException( "no transaction is in progress for a TRANSACTION type persistence context" ); + if ( persistenceContextType == PersistenceContextType.TRANSACTION && ! isTransactionInProgress() ) { + //no need to mark as rollback, no tx in progress + throw new TransactionRequiredException( + "no transaction is in progress for a TRANSACTION type persistence context" + ); } } @@ -166,7 +176,7 @@ getSession().refresh( entity ); } catch (UnresolvableObjectException uoe) { - throw new EntityNotFoundException( uoe ); + throwPersistenceException( new EntityNotFoundException( uoe ) ); } catch (MappingException e) { throw new IllegalArgumentException( e.getMessage(), e ); @@ -174,9 +184,6 @@ } public boolean contains(Object entity) { - //TODO: needed for spec compliance, but inconvenient - // for testing of EM lifecycle - //checkTransactionActive(); try { if ( entity != null && ! ( entity instanceof HibernateProxy ) @@ -191,7 +198,7 @@ } public void flush() { - if (! isTransactionInProgress() ) throw new TransactionRequiredException("no transaction is in progress"); + if ( ! isTransactionInProgress() ) throw new TransactionRequiredException( "no transaction is in progress" ); adjustFlushMode(); getSession().flush(); } @@ -215,7 +222,7 @@ getSession().setFlushMode( FlushMode.COMMIT ); } else { - throw new AssertionFailure("Unknown FlushModeType: " + flushMode); + throw new AssertionFailure( "Unknown FlushModeType: " + flushMode ); } } @@ -226,13 +233,13 @@ public FlushModeType getFlushMode() { FlushMode mode = getSession().getFlushMode(); - if (mode == FlushMode.AUTO) { + if ( mode == FlushMode.AUTO ) { this.flushMode = FlushModeType.AUTO; } - else if (mode == FlushMode.COMMIT) { + else if ( mode == FlushMode.COMMIT ) { this.flushMode = FlushModeType.COMMIT; } - else if (mode == FlushMode.NEVER) { + else if ( mode == FlushMode.NEVER ) { if ( PersistenceContextType.EXTENDED == persistenceContextType && !getTransaction().isActive() ) { //we are in flushMode none for EXTENDED return flushMode; @@ -249,26 +256,28 @@ } public void lock(Object entity, LockModeType lockMode) { - if (! isTransactionInProgress() ) throw new TransactionRequiredException("no transaction is in progress"); + if ( ! isTransactionInProgress() ) throw new TransactionRequiredException( "no transaction is in progress" ); adjustFlushMode(); if ( !contains( entity ) ) throw new IllegalArgumentException( "entity not in the persistence context" ); - getSession().lock( entity, getLockMode(lockMode) ); - + getSession().lock( entity, getLockMode( lockMode ) ); + } private LockMode getLockMode(LockModeType lockMode) { - switch (lockMode) { + switch ( lockMode ) { case READ: return LockMode.UPGRADE; //assuming we are on read-commited and we need to prevent non repeteable read case WRITE: - log.warn( "LockModeType.WRITE does not increment the version number"); + log.warn( "LockModeType.WRITE does not increment the version number" ); return LockMode.UPGRADE; default: - throw new AssertionFailure( "Unknown LockModeType: " + lockMode); + throw new AssertionFailure( "Unknown LockModeType: " + lockMode ); } } - /** adjust the flush mode to match the no tx / no flush behavior */ + /** + * adjust the flush mode to match the no tx / no flush behavior + */ public void adjustFlushMode() { Session session = getSession(); @@ -288,6 +297,40 @@ return ( (SessionImplementor) getSession() ).isTransactionInProgress(); } + protected void markAsRollback() { + if ( tx.isActive() ) { + tx.setRollbackOnly(); + } + else { + if ( PersistenceUnitTransactionType.JTA == transactionType ) { + TransactionManager transactionManager = + ( (SessionFactoryImplementor) getSession().getSessionFactory() ).getTransactionManager(); + if ( transactionManager == null ) { + throw new PersistenceException( + "Using a JTA persistence context wo setting hibernate.transaction.manager_lookup_class" + ); + } + try { + transactionManager.setRollbackOnly(); + } + catch (SystemException e) { + throw new PersistenceException( "Unable to set the JTA transaction as RollbackOnly", e ); + } + } + } + } + + public void joinTransaction() { + + } + + /** + * returns the session + */ + public Object getDelegate() { + return getSession(); + }; + private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); } @@ -296,4 +339,9 @@ ois.defaultReadObject(); tx = new TransactionImpl( this ); } + + public PersistenceException throwPersistenceException(PersistenceException e) { + if ( ! ( e instanceof NoResultException || ( e instanceof NonUniqueResultException ) ) ) markAsRollback(); + throw e; + } } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/QueryImpl.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -9,6 +9,7 @@ import javax.persistence.NoResultException; import javax.persistence.Query; import javax.persistence.TemporalType; +import javax.persistence.TransactionRequiredException; import static javax.persistence.TemporalType.*; import org.hibernate.CacheMode; @@ -22,9 +23,11 @@ */ public class QueryImpl implements Query, HibernateQuery { private org.hibernate.Query query; + private AbstractEntityManagerImpl em; - public QueryImpl(org.hibernate.Query query) { + public QueryImpl(org.hibernate.Query query, AbstractEntityManagerImpl em) { this.query = query; + this.em = em; } public org.hibernate.Query getHibernateQuery() { @@ -32,6 +35,9 @@ } public int executeUpdate() { + if ( ! em.isTransactionInProgress() ) { + throw em.throwPersistenceException( new TransactionRequiredException("Executing an update/delete query") ); + } return query.executeUpdate(); } @@ -44,13 +50,14 @@ Object result = query.uniqueResult(); if ( result == null ) { - throw new NoResultException( "No entity found for query" ); + em.throwPersistenceException( new NoResultException( "No entity found for query" ) ); } return result; } catch (NonUniqueResultException e) { - throw new javax.persistence.NonUniqueResultException( e.getMessage() ); + em.throwPersistenceException( new javax.persistence.NonUniqueResultException( e.getMessage() ) ); + return null; //for the compiler to stop complaining } } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -3,6 +3,7 @@ import javax.persistence.EntityTransaction; import javax.persistence.PersistenceException; +import javax.persistence.RollbackException; import org.hibernate.Session; import org.hibernate.Transaction; @@ -14,6 +15,7 @@ private AbstractEntityManagerImpl entityManager; private Transaction tx; + private boolean rollbackOnly; public TransactionImpl(AbstractEntityManagerImpl entityManager) { this.entityManager = entityManager; @@ -24,6 +26,7 @@ } public void begin() { + rollbackOnly = false; if ( tx != null && tx.isActive() ) { throw new IllegalStateException( "Transaction already active" ); } @@ -35,7 +38,17 @@ if ( tx == null || !tx.isActive() ) { throw new IllegalStateException( "Transaction not active" ); } - tx.commit(); + if (rollbackOnly) { + tx.rollback(); + throw new RollbackException("Transaction marked as rollbackOnly"); + } + try { + tx.commit(); + } + catch (Exception e) { + throw new RollbackException( "Error while commiting the transaction", e); + } + rollbackOnly = false; //if closed and we commit, the mode should have been adjusted already if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } @@ -46,13 +59,23 @@ } try { tx.rollback(); - entityManager.adjustFlushMode(); } catch (RuntimeException e) { throw new PersistenceException("unexpected error when rollbacking", e); } + entityManager.adjustFlushMode(); } + public void setRollbackOnly() { + if ( ! isActive() ) throw new IllegalStateException( "Transaction not active" ); + this.rollbackOnly = true; + } + + public boolean getRollbackOnly() { + if ( ! isActive() ) throw new IllegalStateException( "Transaction not active" ); + return rollbackOnly; + } + public boolean isActive() { try { return tx != null && tx.isActive(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -13,6 +13,21 @@ public class Book { @Id @GeneratedValue(strategy= GenerationType.TABLE) public Integer id; + public String name; - public String name; + 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; + } } Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -5,6 +5,8 @@ import javax.persistence.LockModeType; import javax.persistence.PersistenceContextType; import javax.persistence.TransactionRequiredException; +import javax.persistence.EntityNotFoundException; +import javax.persistence.RollbackException; import org.hibernate.ejb.test.TestCase; import org.hibernate.ejb.HibernateEntityManagerFactory; @@ -180,6 +182,29 @@ em.close(); } + public void testRollbackOnlyOnPersistenceException() throws Exception { + Book book = new Book(); + book.name = "Stolen keys"; + book.id = new Integer( 50 ); + EntityManager em = factory.createEntityManager(); + em.getTransaction().begin(); + try { + em.refresh( book ); + fail("Get reference on wrong entity should fail"); + } + catch (EntityNotFoundException e) { + //success + } + try { + em.getTransaction().commit(); + fail("Commit should be rollbacked"); + } + catch (RollbackException e) { + //success + } + + } + public Class[] getAnnotatedClasses() { return new Class[] { Book.class Added: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityExistsException.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityExistsException.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityExistsException.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -0,0 +1,23 @@ +//$Id: $ +package javax.persistence; + +/** + * @author Emmanuel Bernard + */ +public class EntityExistsException extends PersistenceException { + public EntityExistsException() { + super(); + } + + public EntityExistsException(Throwable cause) { + super( cause ); + } + + public EntityExistsException(String message) { + super( message ); + } + + public EntityExistsException(String message, Throwable cause) { + super( message, cause ); + } +} Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityManager.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -9,11 +9,16 @@ * Make an instance managed and persistent. * * @param entity + * @throws EntityExistsException if the entity already exists. + * (The EntityExistsException may be thrown when the persist + * operation is invoked, or the EntityExistsException or + * another PersistenceException may be thrown at commit + * time.) * @throws IllegalArgumentException if not an entity - * or entity is detached - * @throws TransactionRequiredException if there is - * no transaction and the persistence context is - * of type PersistenceContextType.TRANSACTION + * @throws TransactionRequiredException if invoked on a + * container-managed entity manager of type + * PersistenceContextType.TRANSACTION and there is + * no transaction. */ public void persist(Object entity); @@ -25,9 +30,10 @@ * @return the instance that the state was merged to * @throws IllegalArgumentException if instance is not an * entity or is a removed entity - * @throws TransactionRequiredException if there is - * no transaction and the persistence context is - * of type PersistenceContextType.TRANSACTION + * @throws TransactionRequiredException if invoked on a + * container-managed entity manager of type + * PersistenceContextType.TRANSACTION and there is + * no transaction. */ public <T> T merge(T entity); @@ -37,9 +43,10 @@ * @param entity * @throws IllegalArgumentException if not an entity * or if a detached entity - * @throws TransactionRequiredException if there is - * no transaction and the persistence context is - * of type PersistenceContextType.TRANSACTION + * @throws TransactionRequiredException if invoked on a + * container-managed entity manager of type + * PersistenceContextType.TRANSACTION and there is + * no transaction. */ public void remove(Object entity); @@ -58,13 +65,10 @@ public <T> T find(Class<T> entityClass, Object primaryKey); /** - * EntityManager Enterprise JavaBeans 3.0, Proposed Final Draft Entity Operations - * 39 12/19/05 - * Sun Microsystems, Inc. * Get an instance, whose state may be lazily fetched. * If the requested instance does not exist in the database, - * throws EntityNotFoundException when the instance state is - * first accessed. (The persistence provider runtime is + * the EntityNotFoundException is thrown when the instance + * state is first accessed. (The persistence provider runtime is * permitted to throw the EntityNotFoundException when * getReference is called.) * The application should not expect that the instance state will @@ -131,9 +135,10 @@ * @param entity * @throws IllegalArgumentException if not an entity * or entity is not managed - * @throws TransactionRequiredException if there is - * no transaction and the persistence context is - * of type PersistenceContextType.TRANSACTION + * @throws TransactionRequiredException if invoked on a + * container-managed entity manager of type + * PersistenceContextType.TRANSACTION and there is + * no transaction. * @throws EntityNotFoundException if the entity no longer * exists in the database */ @@ -208,6 +213,18 @@ public Query createNativeQuery(String sqlString, String resultSetMapping); /** + * Indicate to the EntityManager that a JTA transaction is + * active. This method should be called on a JTA application + * managed EntityManager that was created outside the scope + * of the active transaction to associate it with the current + * JTA transaction. + * + * @throws TransactionRequiredException if there is + * no transaction. + */ + public void joinTransaction(); + + /** * Close an application-managed EntityManager. * After an EntityManager has been closed, all methods on the * EntityManager instance will throw the IllegalStateException @@ -232,9 +249,10 @@ * Return the resource-level transaction object. * The EntityTransaction instance may be used serially to * begin and commit multiple transactions. + * * @return EntityTransaction instance * @throws IllegalStateException if invoked on a JTA - * EntityManager or an EntityManager that has been closed. + * EntityManager or an EntityManager that has been closed. */ public EntityTransaction getTransaction(); } \ No newline at end of file Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityNotFoundException.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityNotFoundException.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityNotFoundException.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -4,7 +4,7 @@ /** * @author Gavin King */ -public class EntityNotFoundException extends RuntimeException { +public class EntityNotFoundException extends PersistenceException { public EntityNotFoundException() { super(); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityTransaction.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityTransaction.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityTransaction.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -14,7 +14,7 @@ * changes to the database. * * @throws IllegalStateException if isActive() is false. - * @throws PersistenceException if the commit fails. + * @throws RollbackException if the commit fails. */ public void commit(); @@ -28,10 +28,26 @@ public void rollback(); /** + * Mark the current transaction so that the only possible + * outcome of the transaction is for the transaction to be + * rolled back. + * + * @throws IllegalStateException if isActive() is false. + */ + public void setRollbackOnly(); + + /** + * Determine whether the current transaction has been marked + * for rollback. + * + * @throws IllegalStateException if isActive() is false. + */ + public boolean getRollbackOnly(); + + /** * Indicate whether a transaction is in progress. - * * @throws PersistenceException if an unexpected error - * condition is encountered. + * condition is encountered. */ public boolean isActive(); -} +} \ No newline at end of file Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/NoResultException.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/NoResultException.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/NoResultException.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -6,7 +6,7 @@ * * @author Emmanuel Bernard */ -public class NoResultException extends RuntimeException { +public class NoResultException extends PersistenceException { public NoResultException() { super(); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/NonUniqueResultException.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/NonUniqueResultException.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/NonUniqueResultException.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -4,7 +4,7 @@ /** * @author Gavin King */ -public class NonUniqueResultException extends RuntimeException { +public class NonUniqueResultException extends PersistenceException { public NonUniqueResultException() { super(); Added: trunk/HibernateExt/ejb-api/src/javax/persistence/RollbackException.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/RollbackException.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/RollbackException.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -0,0 +1,25 @@ +//$Id: $ +package javax.persistence; + +/** + * Exception occurs while commiting the transaction + * + * @author Emmanuel Bernard + */ +public class RollbackException extends PersistenceException { + public RollbackException() { + super(); + } + + public RollbackException(Throwable cause) { + super( cause ); + } + + public RollbackException(String message) { + super( message ); + } + + public RollbackException(String message, Throwable cause) { + super( message, cause ); + } +} Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/TransactionRequiredException.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/TransactionRequiredException.java 2006-03-08 19:57:35 UTC (rev 9577) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/TransactionRequiredException.java 2006-03-08 22:41:38 UTC (rev 9578) @@ -4,7 +4,7 @@ /** * @author Gavin King */ -public class TransactionRequiredException extends RuntimeException { +public class TransactionRequiredException extends PersistenceException { public TransactionRequiredException() { super(); |
From: <hib...@li...> - 2006-03-08 19:57:43
|
Author: ste...@jb... Date: 2006-03-08 14:57:35 -0500 (Wed, 08 Mar 2006) New Revision: 9577 Modified: trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java Log: minor Modified: trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java 2006-03-08 05:18:12 UTC (rev 9576) +++ trunk/Hibernate3/src/org/hibernate/impl/SessionImpl.java 2006-03-08 19:57:35 UTC (rev 9577) @@ -221,21 +221,25 @@ } public Session getSession(EntityMode entityMode) { + if ( this.entityMode == entityMode ) { + return this; + } + if ( rootSession != null ) { rootSession.getSession( entityMode ); } + errorIfClosed(); checkTransactionSynchStatus(); - if ( this.entityMode == entityMode ) { - return this; - } - + SessionImpl rtn = null; if ( childSessionsByEntityMode == null ) { childSessionsByEntityMode = new HashMap(); } + else { + rtn = (SessionImpl) childSessionsByEntityMode.get( entityMode ); + } - SessionImpl rtn = (SessionImpl) childSessionsByEntityMode.get( entityMode ); if ( rtn == null ) { rtn = new SessionImpl( this, entityMode ); childSessionsByEntityMode.put( entityMode, rtn ); |
From: <hib...@li...> - 2006-03-08 05:18:14
|
Author: ste...@jb... Date: 2006-03-08 00:18:12 -0500 (Wed, 08 Mar 2006) New Revision: 9576 Modified: trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java Log: HHH-1546 : generated version properties and multiple queued actions Modified: trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java 2006-03-08 05:17:04 UTC (rev 9575) +++ trunk/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java 2006-03-08 05:18:12 UTC (rev 9576) @@ -24,14 +24,14 @@ private final boolean isCascadeDeleteEnabled; private final Object[] state; - public EntityDeleteAction(final Serializable id, - final Object[] state, - final Object version, - final Object instance, - final EntityPersister persister, - final boolean isCascadeDeleteEnabled, - final SessionImplementor session) { - + public EntityDeleteAction( + final Serializable id, + final Object[] state, + final Object version, + final Object instance, + final EntityPersister persister, + final boolean isCascadeDeleteEnabled, + final SessionImplementor session) { super( session, id, instance, persister ); this.version = version; this.isCascadeDeleteEnabled = isCascadeDeleteEnabled; @@ -45,7 +45,15 @@ Object instance = getInstance(); boolean veto = preDelete(); - + + Object version = this.version; + if ( persister.isVersionPropertyGenerated() ) { + // we need to grab the version value from the entity, otherwise + // we have issues with generated-version entities that may have + // multiple actions queued during the same flush + version = persister.getVersion( instance, session.getEntityMode() ); + } + final CacheKey ck; if ( persister.hasCache() ) { ck = new CacheKey( Modified: trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java 2006-03-08 05:17:04 UTC (rev 9575) +++ trunk/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java 2006-03-08 05:18:12 UTC (rev 9576) @@ -64,6 +64,13 @@ boolean veto = preUpdate(); final SessionFactoryImplementor factory = getSession().getFactory(); + Object previousVersion = this.previousVersion; + if ( persister.isVersionPropertyGenerated() ) { + // we need to grab the version value from the entity, otherwise + // we have issues with generated-version entities that may have + // multiple actions queued during the same flush + previousVersion = persister.getVersion( instance, session.getEntityMode() ); + } final CacheKey ck; if ( persister.hasCache() ) { @@ -100,8 +107,8 @@ throw new AssertionFailure( "possible nonthreadsafe access to session" ); } - if ( entry.getStatus()==Status.MANAGED ) { - + if ( entry.getStatus()==Status.MANAGED || persister.isVersionPropertyGenerated() ) { + // get the updated snapshot by cloning current state // it is safe to copy in place, since by this time // no-one else has a reference to the array Modified: trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-08 05:17:04 UTC (rev 9575) +++ trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-08 05:18:12 UTC (rev 9576) @@ -3540,7 +3540,7 @@ public void processUpdateGeneratedProperties(Serializable id, Object entity, Object[] state, SessionImplementor session) { if ( !hasInsertGeneratedProperties() ) { - throw new AssertionFailure("no insert-generated properties"); + throw new AssertionFailure("no update-generated properties"); } processGeneratedProperties( id, entity, state, session, sqlUpdateGeneratedValuesSelectString, getPropertyUpdateGeneration() ); } |
From: <hib...@li...> - 2006-03-08 05:17:08
|
Author: ste...@jb... Date: 2006-03-08 00:17:04 -0500 (Wed, 08 Mar 2006) New Revision: 9575 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java branches/Branch_3_1/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java Log: HHH-1546 : generated version properties and multiple queued actions Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java 2006-03-08 02:28:52 UTC (rev 9574) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityDeleteAction.java 2006-03-08 05:17:04 UTC (rev 9575) @@ -24,14 +24,14 @@ private final boolean isCascadeDeleteEnabled; private final Object[] state; - public EntityDeleteAction(final Serializable id, - final Object[] state, - final Object version, - final Object instance, - final EntityPersister persister, - final boolean isCascadeDeleteEnabled, - final SessionImplementor session) { - + public EntityDeleteAction( + final Serializable id, + final Object[] state, + final Object version, + final Object instance, + final EntityPersister persister, + final boolean isCascadeDeleteEnabled, + final SessionImplementor session) { super( session, id, instance, persister ); this.version = version; this.isCascadeDeleteEnabled = isCascadeDeleteEnabled; @@ -45,6 +45,14 @@ Object instance = getInstance(); boolean veto = preDelete(); + + Object version = this.version; + if ( persister.isVersionPropertyGenerated() ) { + // we need to grab the version value from the entity, otherwise + // we have issues with generated-version entities that may have + // multiple actions queued during the same flush + version = persister.getVersion( instance, session.getEntityMode() ); + } final CacheKey ck; if ( persister.hasCache() ) { Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java 2006-03-08 02:28:52 UTC (rev 9574) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/action/EntityUpdateAction.java 2006-03-08 05:17:04 UTC (rev 9575) @@ -64,6 +64,13 @@ boolean veto = preUpdate(); final SessionFactoryImplementor factory = getSession().getFactory(); + Object previousVersion = this.previousVersion; + if ( persister.isVersionPropertyGenerated() ) { + // we need to grab the version value from the entity, otherwise + // we have issues with generated-version entities that may have + // multiple actions queued during the same flush + previousVersion = persister.getVersion( instance, session.getEntityMode() ); + } final CacheKey ck; if ( persister.hasCache() ) { @@ -100,7 +107,7 @@ throw new AssertionFailure( "possible nonthreadsafe access to session" ); } - if ( entry.getStatus()==Status.MANAGED ) { + if ( entry.getStatus()==Status.MANAGED || persister.isVersionPropertyGenerated() ) { // get the updated snapshot by cloning current state // it is safe to copy in place, since by this time Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-08 02:28:52 UTC (rev 9574) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-03-08 05:17:04 UTC (rev 9575) @@ -3340,7 +3340,7 @@ public void processUpdateGeneratedProperties(Serializable id, Object entity, Object[] state, SessionImplementor session) { if ( !hasInsertGeneratedProperties() ) { - throw new AssertionFailure("no insert-generated properties"); + throw new AssertionFailure("no update-generated properties"); } processGeneratedProperties( id, entity, state, session, sqlUpdateGeneratedValuesSelectString, getPropertyUpdateGeneration() ); } |
From: <hib...@li...> - 2006-03-08 02:29:44
|
Author: epbernard Date: 2006-03-07 21:28:52 -0500 (Tue, 07 Mar 2006) New Revision: 9574 Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/PrimaryKeyJoinColumns.java trunk/HibernateExt/ejb-api/src/javax/persistence/SequenceGenerator.java trunk/HibernateExt/ejb-api/src/javax/persistence/TableGenerator.java Log: Update EJB3 API Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/PrimaryKeyJoinColumns.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/PrimaryKeyJoinColumns.java 2006-03-08 02:21:04 UTC (rev 9573) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/PrimaryKeyJoinColumns.java 2006-03-08 02:28:52 UTC (rev 9574) @@ -11,7 +11,7 @@ /** * @author Emmanuel Bernard */ -@Target({TYPE}) @Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface PrimaryKeyJoinColumns { PrimaryKeyJoinColumn[] value() default {}; } Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/SequenceGenerator.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/SequenceGenerator.java 2006-03-08 02:21:04 UTC (rev 9573) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/SequenceGenerator.java 2006-03-08 02:28:52 UTC (rev 9574) @@ -11,10 +11,11 @@ /** * @author Emmanuel Bernard */ +//TODO remove Package eventually @Target({PACKAGE, TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface SequenceGenerator { String name(); String sequenceName() default ""; - int initialValue() default 0; + int initialValue() default 1; int allocationSize() default 50; } Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/TableGenerator.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/TableGenerator.java 2006-03-08 02:21:04 UTC (rev 9573) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/TableGenerator.java 2006-03-08 02:28:52 UTC (rev 9574) @@ -10,6 +10,7 @@ /** * @author Emmanuel Bernard */ +//TODO remove Package eventually @Target({PACKAGE, TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface TableGenerator { |
From: <hib...@li...> - 2006-03-08 02:21:24
|
Author: epbernard Date: 2006-03-07 21:21:04 -0500 (Tue, 07 Mar 2006) New Revision: 9573 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java Log: fake support for @PrimaryKeyJoinColumns on @OneToOne Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-08 01:28:05 UTC (rev 9572) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-08 02:21:04 UTC (rev 9573) @@ -1132,7 +1132,9 @@ } else if ( property.isAnnotationPresent( OneToOne.class ) ) { OneToOne ann = property.getAnnotation( OneToOne.class ); - boolean trueOneToOne = property.isAnnotationPresent( PrimaryKeyJoinColumn.class ); + //FIXME support a proper PKJCs + boolean trueOneToOne = property.isAnnotationPresent( PrimaryKeyJoinColumn.class ) + || property.isAnnotationPresent( PrimaryKeyJoinColumns.class ); Cascade hibernateCascade = property.getAnnotation( Cascade.class ); NotFound notFound = property.getAnnotation( NotFound.class ); boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE ); |
From: <hib...@li...> - 2006-03-08 01:30:50
|
Author: epbernard Date: 2006-03-07 20:28:05 -0500 (Tue, 07 Mar 2006) New Revision: 9572 Added: trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverride.java trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverrides.java trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMappings.java Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/DiscriminatorColumn.java trunk/HibernateExt/ejb-api/src/javax/persistence/EntityResult.java trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumn.java trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumns.java trunk/HibernateExt/ejb-api/src/javax/persistence/NamedNativeQuery.java trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQueries.java trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQuery.java trunk/HibernateExt/ejb-api/src/javax/persistence/PostRemove.java trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMapping.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java Log: Update EJB3 API ANN-275 Added: trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverride.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverride.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverride.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -0,0 +1,18 @@ +//$Id: $ +package javax.persistence; + +import java.lang.annotation.Target; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.FIELD; + +/** + * @author Emmanuel Bernard + */ +@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) +public @interface AssociationOverride { + String name(); + JoinColumn[] joinColumns(); +} Added: trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverrides.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverrides.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/AssociationOverrides.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -0,0 +1,17 @@ +//$Id: $ +package javax.persistence; + +import java.lang.annotation.Target; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.FIELD; + +/** + * @author Emmanuel Bernard + */ +@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) +public @interface AssociationOverrides { + AssociationOverride[] value(); +} Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/DiscriminatorColumn.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/DiscriminatorColumn.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/DiscriminatorColumn.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -14,7 +14,7 @@ */ @Target({TYPE}) @Retention(RUNTIME) public @interface DiscriminatorColumn { - String name() default ""; + String name() default "DTYPE"; DiscriminatorType discriminatorType() default STRING; String columnDefinition() default ""; int length() default 31; Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/EntityResult.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/EntityResult.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/EntityResult.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -11,7 +11,7 @@ */ @Target({}) @Retention(RetentionPolicy.RUNTIME) public @interface EntityResult { - String name(); + Class entityClass(); + FieldResult[] fields() default {}; String discriminatorColumn() default ""; - FieldResult[] fields() default {}; } Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumn.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumn.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumn.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -11,7 +11,7 @@ /** * @author Emmanuel Bernard */ -@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) +@Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface JoinColumn { String name() default ""; String referencedColumnName() default ""; Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumns.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumns.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/JoinColumns.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -11,7 +11,7 @@ /** * @author Emmanuel Bernard */ -@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) +@Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface JoinColumns { JoinColumn[] value() default {}; } Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/NamedNativeQuery.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/NamedNativeQuery.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/NamedNativeQuery.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -10,6 +10,7 @@ /** * @author Emmanuel Bernard */ +//TODO remove the package target @Target({TYPE, PACKAGE}) @Retention(RUNTIME) public @interface NamedNativeQuery { @@ -21,5 +22,5 @@ Class resultClass() default void.class; - String resultSetMapping() default ""; // name of SQLResultSet Mapping + String resultSetMapping() default ""; // name of SQLResultSetMapping } Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQueries.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQueries.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQueries.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -11,6 +11,7 @@ /** * @author Emmanuel Bernard */ +//TODO remove PACKAGE target @Target({TYPE, PACKAGE}) @Retention(RUNTIME) public @interface NamedQueries { NamedQuery [] value (); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQuery.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQuery.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/NamedQuery.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -10,6 +10,7 @@ /** * @author Emmanuel Bernard */ +//TODO remove the mackage target @Target({TYPE, PACKAGE}) @Retention(RUNTIME) public @interface NamedQuery { String name(); Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/PostRemove.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/PostRemove.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/PostRemove.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -17,7 +17,7 @@ * * @author <a href="mailto:bi...@jb...">Bill Burke</a> */ -@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) +@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface PostRemove { Modified: trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMapping.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMapping.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMapping.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -10,7 +10,7 @@ /** * @author Emmanuel Bernard */ - +//TODO remove the package target @Target({ElementType.PACKAGE, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface SqlResultSetMapping { String name(); Added: trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMappings.java =================================================================== --- trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMappings.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/ejb-api/src/javax/persistence/SqlResultSetMappings.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -0,0 +1,18 @@ +//$Id: SqlResultSetMapping.java 9044 2006-01-12 20:58:41 -0500 (jeu., 12 janv. 2006) epbernard $ +//EJB3 Specification Copyright 2004 - 2006 Sun Microsystems, Inc. + +package javax.persistence; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * @author Emmanuel Bernard + */ +//TODO remove Package target +@Target({ElementType.PACKAGE, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) +public @interface SqlResultSetMappings { + SqlResultSetMapping[] value(); +} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2006-03-08 00:50:19 UTC (rev 9571) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2006-03-08 01:28:05 UTC (rev 9572) @@ -15,7 +15,7 @@ public class Ejb3DiscriminatorColumn extends Ejb3Column { - private static final String DEFAULT_DISCRIMINATOR_COLUMN_NAME = "TYPE"; + private static final String DEFAULT_DISCRIMINATOR_COLUMN_NAME = "DTYPE"; private static final String DEFAULT_DISCRIMINATOR_TYPE = "string"; private String discriminatorTypeName; @@ -43,12 +43,6 @@ Ejb3DiscriminatorColumn discriminatorColumn = new Ejb3DiscriminatorColumn(); discriminatorColumn.setMappings( mappings ); discriminatorColumn.setImplicit( true ); -// String discrSqlType = null; -// String discrColumnName = DEFAULT_DISCRIMINATOR_COLUMN_NAME; -// int discrLength = 255; -// boolean discrNullable = false; -// String discrTypeName = "string"; -// boolean isImplicit = true; if ( discFormulaAnn != null ) { discriminatorColumn.setImplicit( false ); discriminatorColumn.setFormula( discFormulaAnn.value() ); @@ -63,14 +57,6 @@ if ( ! AnnotationBinder.isDefault( discAnn.name() ) ) discriminatorColumn.setLogicalColumnName( discAnn.name() ); discriminatorColumn.setNullable( false ); } -// boolean overrideDefaultValues = discAnn != null; -// if (overrideDefaultValues) { -// isImplicit = false; -// discrSqlType = "".equals( discAnn.columnDefinition() ) ? null : discAnn.columnDefinition(); -// discrColumnName = "".equals( discAnn.name() ) ? DEFAULT_DISCRIMINATOR_COLUMN_NAME : discAnn.name(); -// discrNullable = discAnn.nullable(); -// -// } if ( DiscriminatorType.CHAR.equals( type ) ) { discriminatorColumn.setDiscriminatorTypeName( "character" ); discriminatorColumn.setImplicit( false ); @@ -82,14 +68,10 @@ else if ( DiscriminatorType.STRING.equals( type ) || type == null ) { if ( discAnn != null ) discriminatorColumn.setLength( discAnn.length() ); discriminatorColumn.setDiscriminatorTypeName( "string" ); -// discrLength = overrideDefaultValues ? discAnn.length() : discrLength; -// discrTypeName = "string"; } else { throw new AssertionFailure( "Unknown discriminator type: " + type ); } -// discriminatorColumn = new Ejb3DiscriminatorColumn(isImplicit, discrSqlType, discrLength, discrColumnName, discrNullable, -// false, false, false, (String) null, null, null, discrTypeName, mappings); discriminatorColumn.bind(); return discriminatorColumn; } |
Author: epbernard Date: 2006-03-07 19:50:19 -0500 (Tue, 07 Mar 2006) New Revision: 9571 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java Log: EJB-135 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -434,8 +434,13 @@ return createEntityManagerFactory( cfg.getProperties(), new HashMap() ); } - private EntityManagerFactory buildEntityManagerFactory(PersistenceUnitTransactionType transactionType) { - return new EntityManagerFactoryImpl( cfg.buildSessionFactory(), transactionType ); + private EntityManagerFactory buildEntityManagerFactory(PersistenceUnitTransactionType transactionType, + boolean discardOnClose) { + return new EntityManagerFactoryImpl( + cfg.buildSessionFactory(), + transactionType, + discardOnClose + ); } /** @@ -595,9 +600,10 @@ if ( ! "true".equalsIgnoreCase( cfg.getProperty( Environment.AUTOCOMMIT ) ) ) { log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" ); } - + boolean discardOnClose = properties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" ).equals( "true"); return buildEntityManagerFactory( - (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE) + (PersistenceUnitTransactionType) workingVars.get(HibernatePersistence.TRANSACTION_TYPE), + discardOnClose ); } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -14,10 +14,15 @@ private SessionFactory sessionFactory; private PersistenceUnitTransactionType transactionType; + private boolean discardOnClose; - public EntityManagerFactoryImpl(SessionFactory sessionFactory, PersistenceUnitTransactionType transactionType) { + public EntityManagerFactoryImpl( + SessionFactory sessionFactory, + PersistenceUnitTransactionType transactionType, + boolean discardOnClose) { this.sessionFactory = sessionFactory; this.transactionType = transactionType; + this.discardOnClose = discardOnClose; } public EntityManager createEntityManager() { @@ -25,7 +30,7 @@ } public EntityManager createEntityManager(PersistenceContextType type) { - return new EntityManagerImpl( sessionFactory, type, transactionType ); + return new EntityManagerImpl( sessionFactory, type, transactionType, discardOnClose ); } public EntityManager getEntityManager() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/EntityManagerImpl.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -3,6 +3,7 @@ import javax.persistence.PersistenceContextType; import javax.persistence.spi.PersistenceUnitTransactionType; +import javax.transaction.Synchronization; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -16,14 +17,17 @@ protected Session session; protected SessionFactory sessionFactory; protected boolean open; + protected boolean discardOnClose; public EntityManagerImpl( SessionFactory sessionFactory, PersistenceContextType pcType, - PersistenceUnitTransactionType transactionType + PersistenceUnitTransactionType transactionType, + boolean discardOnClose ) { super( pcType, transactionType ); this.sessionFactory = sessionFactory; - open = true; + this.open = true; + this.discardOnClose = discardOnClose; } public Session getSession() { @@ -44,10 +48,26 @@ public void close() { if ( !open ) throw new IllegalStateException( "EntityManager is closed" ); - //if ( isTransactionInProgress() ) throw new IllegalStateException( "transaction in progress"); + if ( !discardOnClose && isTransactionInProgress() ) { + //delay the closing till the end of the enlisted transaction + getSession().getTransaction().registerSynchronization( new Synchronization() { + public void beforeCompletion() { + //nothing to do + } + + public void afterCompletion(int i) { + //TODO should I check for isOpen() ? + if (session != null) session.close(); + //TODO session == null should not happen + } + } + ); + } + else { + //close right now + if ( session != null ) session.close(); + } open = false; - if ( session != null ) session.close(); - } public boolean isOpen() { Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/HibernatePersistence.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -76,6 +76,11 @@ * Enable the class file enhancement */ public static final String USE_CLASS_ENHANCER = "hibernate.ejb.use_class_enhancer"; + /** + * Whether or not discard persistent context on entityManager.close() + * The EJB3 compliant and default choice is false + */ + public static final String DISCARD_PC_ON_CLOSE = "hibernate.ejb.discard_pc_on_close"; //The following properties are for Internal use only /** Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/TransactionImpl.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -36,7 +36,8 @@ throw new IllegalStateException( "Transaction not active" ); } tx.commit(); - entityManager.adjustFlushMode(); + //if closed and we commit, the mode should have been adjusted already + if ( entityManager.isOpen() ) entityManager.adjustFlushMode(); } public void rollback() { Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -276,7 +276,7 @@ in.close(); byteIn.close(); assertNull( deserializedException.getCause() ); - assertNotNull( e.getCause() ); + assertNull( e.getCause() ); } em.getTransaction().commit(); em.close(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/Item.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -17,9 +17,9 @@ */ @Entity(name = "Item") @SqlResultSetMapping(name = "getItem", entities = - @EntityResult(name = "org.hibernate.ejb.test.Item", fields = { - @FieldResult(name = "name", column = "itemname"), - @FieldResult(name = "descr", column = "itemdescription") + @EntityResult(entityClass = org.hibernate.ejb.test.Item.class, fields = { + @FieldResult(name = "name", column = "itemname"), + @FieldResult(name = "descr", column = "itemdescription") }) ) //@Cache(region="Item", usage=NONSTRICT_READ_WRITE) Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -42,7 +42,7 @@ manager.getTransaction().commit(); manager.getTransaction().begin(); - assertEquals( manager.createQuery( "from Person" ).getResultList().size(), 3 ); + assertEquals( manager.createQuery( "select p.address, p.name from Person p order by p.name" ).getResultList().size(), 3 ); assertEquals( manager.createQuery( "from Person p where p.class = Customer" ).getResultList().size(), 1 ); manager.getTransaction().commit(); Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-07 21:58:29 UTC (rev 9570) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-03-08 00:50:19 UTC (rev 9571) @@ -157,14 +157,26 @@ public void testCloseAndTransaction() throws Exception { EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); + Book book = new Book(); + book.name = "Java for Dummies"; + em.persist( book ); + em.close(); + book.name = "C# for Dummies"; + assertFalse( em.isOpen() ); try { - em.close(); - fail("transaction in progress"); + em.flush(); + fail("direct action on a closed em should fail"); } catch (IllegalStateException e) { //success } em.getTransaction().commit(); + em = factory.createEntityManager( ); + em.getTransaction().begin(); + book = em.find( Book.class, book.id ); + assertEquals( "C# for Dummies", book.name ); + em.remove( book ); + em.getTransaction().commit(); em.close(); } |
From: <hib...@li...> - 2006-03-07 21:58:32
|
Author: epbernard Date: 2006-03-07 16:58:29 -0500 (Tue, 07 Mar 2006) New Revision: 9570 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java Log: DTDEntityResolver that solve the orm xsd Added: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2006-03-07 21:12:50 UTC (rev 9569) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2006-03-07 21:58:29 UTC (rev 9570) @@ -0,0 +1,49 @@ +//$Id: $ +package org.hibernate.cfg; + +import java.io.InputStream; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hibernate.util.DTDEntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.EntityResolver; + +/** + * @author Emmanuel Bernard + */ +public class EJB3DTDEntityResolver extends DTDEntityResolver { + public static final EntityResolver INSTANCE = new EJB3DTDEntityResolver(); + + private static final Log log = LogFactory.getLog( DTDEntityResolver.class ); + + private static final String EJB3ORM_NAMESPACE = "http://java.sun.com/xml/ns/persistence/orm"; + + public InputSource resolveEntity(String publicId, String systemId) { + InputSource is = super.resolveEntity( publicId, systemId ); + if (is == null) { + if ( systemId != null ) { + if ( systemId.endsWith( "orm_1_0.xsd" ) ) { + log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/" ); + String path = "org/hibernate/ejb/" + "orm_1_0.xsd"; + InputStream dtdStream = resolveInHibernateNamespace( path ); + if ( dtdStream == null ) { + log.debug( "unable to locate [" + systemId + "] on classpath" ); + } + else { + log.debug( "located [" + systemId + "] in classpath" ); + InputSource source = new InputSource( dtdStream ); + source.setPublicId( publicId ); + source.setSystemId( systemId ); + return source; + } + } + } + } + else { + return is; + } + //use the default behavior + return null; + } +} |
From: <hib...@li...> - 2006-03-07 21:13:13
|
Author: nusco Date: 2006-03-07 16:12:50 -0500 (Tue, 07 Mar 2006) New Revision: 9569 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java Removed: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java Log: Approximation of generic types Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -575,7 +575,7 @@ do { current = state.clazz; if ( current.isAnnotationPresent( IdClass.class) ) { - idClass = (IdClass) current.getAnnotation( IdClass.class ); + idClass = current.getAnnotation( IdClass.class ); break; } state = InheritanceState.getSuperclassInheritanceState( current, inheritanceStatePerClass ); @@ -706,7 +706,7 @@ explicitAccessType = superEntityState != null ? superEntityState.accessType : null; } else { - AccessType access = (AccessType) clazzToProcess.getAnnotation( AccessType.class ); + AccessType access = clazzToProcess.getAnnotation( AccessType.class ); explicitAccessType = access != null ? access.value() : null; if ( "property".equals( explicitAccessType ) ) { isExplicitPropertyAnnotated = Boolean.TRUE; @@ -847,7 +847,7 @@ String propertyAccessor, final XClass annotatedClass ) { boolean hasIdentifier = false; - AccessType access = (AccessType) annotatedClass.getAnnotation( AccessType.class ); + AccessType access = annotatedClass.getAnnotation( AccessType.class ); String localPropertyAccessor = access != null ? access.value() : null; String accessType = null; if ( "property".equals( localPropertyAccessor ) || "field".equals( localPropertyAccessor ) ) { @@ -869,6 +869,8 @@ log.debug( "Processing " + propertyHolder.getEntityName() + " " + accessType + " annotation" ); List<XProperty> properties = annotatedClass.getDeclaredProperties(accessType); for ( XProperty p : properties ) { + if( !p.isTypeResolved() ) + throw new IllegalStateException( "Couldn't bind the type for property " + p ); final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor ); hasIdentifier = hasIdentifier || currentHasIdentifier; } @@ -944,8 +946,8 @@ } } if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) { - Column ann = (Column) property.getAnnotation( Column.class ); - Formula formulaAnn = (Formula) property.getAnnotation( Formula.class ); + Column ann = property.getAnnotation( Column.class ); + Formula formulaAnn = property.getAnnotation( Formula.class ); columns = Ejb3Column.buildColumnFromAnnotation( new Column[]{ann}, formulaAnn, nullability, propertyHolder, inferredData, entityBinder.getSecondaryTables(), mappings @@ -985,7 +987,7 @@ else if ( joinColumns == null && ( property.isAnnotationPresent( OneToMany.class ) || property.isAnnotationPresent( CollectionOfElements.class ) ) ) { - OneToMany oneToMany = (OneToMany) property.getAnnotation( OneToMany.class ); + OneToMany oneToMany = property.getAnnotation( OneToMany.class ); String mappedBy = oneToMany != null ? oneToMany.mappedBy() : ""; @@ -1038,7 +1040,7 @@ localGenerators.putAll( buildLocalGenerators( property, mappings ) ); //manage composite related metadata - Embeddable embeddableAnn = (Embeddable) returnedClass.getAnnotation( Embeddable.class ); + Embeddable embeddableAnn = returnedClass.getAnnotation( Embeddable.class ); //guess if its a component and find id data access (property, field etc) final boolean isComponent = embeddableAnn != null || property.isAnnotationPresent( EmbeddedId.class ); boolean propertyAnnotated = entityBinder.isPropertyAnnotated( returnedClass ); @@ -1117,7 +1119,7 @@ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ); bindManyToOne( getCascadeStrategy( ann.cascade(), hibernateCascade ), - (Ejb3JoinColumn[]) joinColumns, + joinColumns, ann.optional(), getFetchMode( ann.fetch() ), ignoreNotFound, onDeleteCascade, inferredData.getPropertyName(), @@ -1138,7 +1140,7 @@ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ); bindOneToOne( getCascadeStrategy( ann.cascade(), hibernateCascade ), - (Ejb3JoinColumn[]) joinColumns, + joinColumns, ann.optional(), getFetchMode( ann.fetch() ), ignoreNotFound, onDeleteCascade, inferredData.getPropertyName(), @@ -1207,8 +1209,8 @@ if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) { - Column ann = (Column) property.getAnnotation( Column.class ); - Formula formulaAnn = (Formula) property.getAnnotation( Formula.class ); + Column ann = property.getAnnotation( Column.class ); + Formula formulaAnn = property.getAnnotation( Formula.class ); elementColumns = Ejb3Column.buildColumnFromAnnotation( new Column[]{ann}, formulaAnn, @@ -1309,7 +1311,7 @@ boolean optional = true; boolean lazy = false; if ( property.isAnnotationPresent( Basic.class ) ) { - Basic ann = (Basic) property.getAnnotation( Basic.class ); + Basic ann = property.getAnnotation( Basic.class ); optional = ann.optional(); lazy = ann.fetch() == FetchType.LAZY; } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -41,7 +41,7 @@ boolean isPrimitive(); boolean isEnum(); - + boolean isAssignableFrom(XClass c); List<XProperty> getDeclaredProperties(String accessType); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -8,7 +8,6 @@ */ public abstract interface XMember extends XAnnotatedElement { - String getName(); boolean isCollection(); @@ -36,6 +35,11 @@ * The type of this property's elements for arrays, the type of the property itself for everything else. */ XClass getClassOrElementClass(); + + /** + * The type of this map's key, or null for anything that is not a map. + */ + XClass getMapKey(); /** * Same modifiers as java.lang.Member#getModifiers() @@ -46,4 +50,6 @@ void setAccessible(boolean accessible); public Object invoke(Object target, Object... parameters); + + boolean isTypeResolved(); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -10,6 +10,4 @@ * * @author Emmanuel Bernard */ -public interface XMethod extends XMember { - Object invoke(Object target, Object... parameters); -} +public interface XMethod extends XMember {} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -18,6 +18,4 @@ * Unqualify the getter name */ String getName(); - - boolean isTypeResolved(); } Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,76 @@ +package org.hibernate.reflection.java; + +import java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.Type; +import java.util.Collection; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeSwitch; + +/** + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +class JavaXArrayType extends JavaXType { + + public JavaXArrayType(Type type, TypeEnvironment context, JavaXFactory factory) { + super( type, context, factory ); + } + + public boolean isArray() { + return true; + } + + public boolean isCollection() { + return false; + } + + public XClass getElementClass() { + return toXClass( getElementType() ); + } + + private Type getElementType() { + return new TypeSwitch<Type>() { + @Override + public Type caseClass(Class classType) { + return classType.getComponentType(); + } + + @Override + public Type caseGenericArrayType(GenericArrayType genericArrayType) { + return genericArrayType.getGenericComponentType(); + } + + @Override + public Type defaultCase(Type t) { + throw new IllegalArgumentException( t + " is not an array type" ); + } + }.doSwitch( resolve() ); + } + + public XClass getClassOrElementClass() { + return getElementClass(); + } + + public Class<? extends Collection> getCollectionClass() { + return null; + } + + public XClass getMapKey() { + return null; + } + + public XClass getType() { + Type boundType = getElementType(); + if ( boundType instanceof Class ) { + boundType = arrayTypeOf( (Class) boundType ); + } + return toXClass( boundType ); + } + + private Class<? extends Object> arrayTypeOf(Class componentType) { + return Array.newInstance( componentType, 0 ).getClass(); + } +} \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -1,16 +1,15 @@ package org.hibernate.reflection.java; import java.lang.reflect.Field; -import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.LinkedList; import java.util.List; +import org.hibernate.reflection.Filter; import org.hibernate.reflection.XClass; -import org.hibernate.reflection.XProperty; import org.hibernate.reflection.XMethod; -import org.hibernate.reflection.Filter; +import org.hibernate.reflection.XProperty; import org.hibernate.reflection.java.generics.TypeEnvironment; /** @@ -65,7 +64,7 @@ List<XProperty> result = new LinkedList<XProperty>(); for ( Field f : toClass().getDeclaredFields() ) if ( JavaXProperty.isProperty( f, getTypeEnvironment().bind( f.getGenericType() ), filter ) ) - maybeAdd( result, f ); + result.add( getFactory().getXProperty( f, this ) ); return result; } @@ -73,17 +72,10 @@ List<XProperty> result = new LinkedList<XProperty>(); for ( Method m : toClass().getDeclaredMethods() ) if ( JavaXProperty.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ), filter ) ) - maybeAdd( result, m ); + result.add( getFactory().getXProperty( m, this ) ); return result; } - // TODO: remove to allow properties with unresolved types - private void maybeAdd(List<XProperty> result, Member m) { - XProperty property = getFactory().getXProperty( m, this ); - if( property.isTypeResolved() ) - result.add( property ); - } - public List<XProperty> getDeclaredProperties(String accessType) { return getDeclaredProperties( accessType, XClass.DEFAULT_FILTER ); } @@ -96,6 +88,14 @@ throw new IllegalArgumentException( "Unknown access type " + accessType ); } + public List<XMethod> getDeclaredMethods() { + List<XMethod> result = new LinkedList<XMethod>(); + for ( Method m : toClass().getDeclaredMethods() ) { + result.add( getFactory().getXMethod( m, this ) ); + } + return result; + } + public Class<?> toClass() { return (Class) toAnnotatedElement(); } @@ -108,17 +108,7 @@ return toClass().isArray(); } - public List<XMethod> getDeclaredMethods() { - List<XMethod> result = new LinkedList<XMethod>(); - for ( Method m : toClass().getDeclaredMethods() ) { - // if ( JavaXProperty.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ) ) ) - XMethod p = getFactory().getXMethod( m, this ); - if (p != null) result.add(p); - } - return result; - } - TypeEnvironment getTypeEnvironment() { return context; } -} +} \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,71 @@ +package org.hibernate.reflection.java; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.Map; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeSwitch; +import org.hibernate.reflection.java.generics.TypeUtils; + +/** + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +class JavaXCollectionType extends JavaXType { + + public JavaXCollectionType(Type type, TypeEnvironment context, JavaXFactory factory) { + super( type, context, factory ); + } + + public boolean isArray() { + return false; + } + + public boolean isCollection() { + return true; + } + + public XClass getElementClass() { + return new TypeSwitch<XClass>() { + @Override + public XClass caseParameterizedType(ParameterizedType parameterizedType) { + Type[] args = parameterizedType.getActualTypeArguments(); + Type componentType; + if ( getCollectionClass().isAssignableFrom( Map.class ) ) { + componentType = args[1]; + } + else { + componentType = args[0]; + } + return toXClass( componentType ); + } + }.doSwitch( resolve() ); + } + + public XClass getMapKey() { + return new TypeSwitch<XClass>() { + @Override + public XClass caseParameterizedType(ParameterizedType parameterizedType) { + if ( getCollectionClass().isAssignableFrom( Map.class ) ) { + return toXClass( parameterizedType.getActualTypeArguments()[0] ); + } + return null; + } + }.doSwitch( resolve() ); + } + + public XClass getClassOrElementClass() { + return toXClass( resolve() ); + } + + public Class<? extends Collection> getCollectionClass() { + return TypeUtils.getCollectionClass( resolve() ); + } + + public XClass getType() { + return toXClass( resolve() ); + } +} \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -1,11 +1,8 @@ package org.hibernate.reflection.java; -import java.lang.reflect.Array; -import java.lang.reflect.GenericArrayType; import java.lang.reflect.Member; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -56,6 +53,7 @@ private final Map<Package, JavaXPackage> packagesToXPackages = new HashMap<Package, JavaXPackage>(); private final Map<PropertyKey, JavaXProperty> xProperties = new HashMap<PropertyKey, JavaXProperty>(); + private final Map<PropertyKey, JavaXMethod> xMethods = new HashMap<PropertyKey, JavaXMethod>(); private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory(); @@ -108,7 +106,7 @@ public XClass caseParameterizedType(ParameterizedType parameterizedType) { return toXClass( parameterizedType.getRawType(), context ); } - }.doSwitch( t ); + }.doSwitch( context.bind( t ) ); } XPackage getXAnnotatedElement(Package pkg) { @@ -142,141 +140,6 @@ return xMethod; } - private PropertyTypeExtractor buildArrayTypeExtractor(final TypeEnvironment context, final Type propType) { - return new PropertyTypeExtractor() { - - public boolean isArray() { - return true; - } - - public boolean isCollection() { - return false; - } - - public XClass getElementClass() { - return JavaXFactory.this.toXClass( getElementType(), context ); - } - - private Type getElementType() { - return new TypeSwitch<Type>() { - @Override - public Type caseClass(Class classType) { - return classType.getComponentType(); - } - - @Override - public Type caseGenericArrayType(GenericArrayType genericArrayType) { - return genericArrayType.getGenericComponentType(); - } - - @Override - public Type defaultCase(Type t) { - throw new IllegalArgumentException( t + " is not an array type" ); - } - }.doSwitch( propType ); - } - - public XClass getClassOrElementClass() { - return getElementClass(); - } - - public Class<? extends Collection> getCollectionClass() { - return null; - } - - public XClass getType() { - Type boundType = getElementType(); - if ( boundType instanceof Class ) { - boundType = arrayTypeOf( (Class) boundType ); - } - return JavaXFactory.this.toXClass( boundType, context ); - } - - private Class<? extends Object> arrayTypeOf(Class componentType) { - return Array.newInstance( componentType, 0 ).getClass(); - } - }; - } - - private PropertyTypeExtractor buildCollectionTypeExtractor(final TypeEnvironment context, final Type propType) { - return new PropertyTypeExtractor() { - - public boolean isArray() { - return false; - } - - public boolean isCollection() { - return true; - } - - public XClass getElementClass() { - return new TypeSwitch<XClass>() { - @Override - public XClass caseParameterizedType(ParameterizedType parameterizedType) { - Type[] args = parameterizedType.getActualTypeArguments(); - Type componentType; - if ( getCollectionClass().isAssignableFrom( Map.class ) ) { - componentType = args[1]; - } - else { - componentType = args[0]; - } - return JavaXFactory.this.toXClass( componentType, context ); - } - }.doSwitch( propType ); - } - - public XClass getClassOrElementClass() { - return JavaXFactory.this.toXClass( context.bind( propType ), context ); - } - - public Class<? extends Collection> getCollectionClass() { - return TypeUtils.getCollectionClass( propType ); - } - - public XClass getType() { - return JavaXFactory.this.toXClass( getJavaType(), context ); - } - - private Type getJavaType() { - return context.bind( propType ); - } - }; - } - - private PropertyTypeExtractor buildSimpleTypeExtractor(final TypeEnvironment context, final Type propType) { - return new PropertyTypeExtractor() { - - public boolean isArray() { - return false; - } - - public boolean isCollection() { - return false; - } - - public XClass getElementClass() { - return JavaXFactory.this.toXClass( context.bind( propType ), context ); - } - - public XClass getClassOrElementClass() { - return getElementClass(); - } - - public Class<? extends Collection> getCollectionClass() { - return null; - } - - public XClass getType() { - return JavaXFactory.this.toXClass( getJavaType(), context ); - } - - private Type getJavaType() { - return context.bind( propType ); - } - }; - } - TypeEnvironment getTypeEnvironment(final Type t) { return new TypeSwitch<TypeEnvironment>() { @Override @@ -296,15 +159,16 @@ }.doSwitch( t ); } - public PropertyTypeExtractor buildTypeExtractor(TypeEnvironment context, Type propType) { - if ( TypeUtils.isArray( propType ) ) - return buildArrayTypeExtractor( context, propType ); - if ( TypeUtils.isCollection( propType ) ) - return buildCollectionTypeExtractor( context, propType ); - if ( TypeUtils.isBase( propType ) ) - return buildSimpleTypeExtractor( context, propType ); - // TODO: manage unresolved types and void.class - return buildSimpleTypeExtractor( context, propType ); + public JavaXType toXType(TypeEnvironment context, Type propType) { + Type boundType = toApproximatingEnvironment( context ).bind( propType ); + if ( TypeUtils.isArray( boundType ) ) + return new JavaXArrayType( propType, context, this ); + if ( TypeUtils.isCollection( boundType ) ) + return new JavaXCollectionType( propType, context, this ); + if ( TypeUtils.isBase( boundType ) ) + return new JavaXSimpleType( propType, context, this ); + assert TypeUtils.isVoid( boundType ); + throw new IllegalArgumentException( "No PropertyTypeExtractor available for type void "); } public boolean equals(XClass class1, Class class2) { @@ -314,6 +178,10 @@ return ( (JavaXClass) class1 ).toClass().equals( class2 ); } + public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) { + return typeEnvs.toApproximatingEnvironment( context ); + } + XMLContext getXMLContext() { return xmlContext; } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -17,9 +17,9 @@ * @author Emmanuel Bernard */ public abstract class JavaXMember extends JavaXAnnotatedElement implements XMember { - protected final Type type; - protected final TypeEnvironment env; - protected final PropertyTypeExtractor propertyTypeExtractor; + private final Type type; + private final TypeEnvironment env; + private final JavaXType xType; protected static Type typeOf(Member member, TypeEnvironment env) { if ( member instanceof Field ) @@ -29,15 +29,15 @@ throw new IllegalArgumentException( "Member " + member + " is neither a field nor a method" ); } - protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { + protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaXFactory factory, JavaXType xType) { super( (AnnotatedElement) member, factory ); this.type = type; this.env = env; - this.propertyTypeExtractor = propertyTypeExtractor; + this.xType = xType; } public XClass getType() { - return propertyTypeExtractor.getType(); + return xType.getType(); } public abstract String getName(); @@ -55,29 +55,37 @@ } public Class<? extends Collection> getCollectionClass() { - return propertyTypeExtractor.getCollectionClass(); + return xType.getCollectionClass(); } public XClass getClassOrElementClass() { - return propertyTypeExtractor.getClassOrElementClass(); + return xType.getClassOrElementClass(); } public XClass getElementClass() { - return propertyTypeExtractor.getElementClass(); + return xType.getElementClass(); } + public XClass getMapKey() { + return xType.getMapKey(); + } + public boolean isArray() { - return propertyTypeExtractor.isArray(); + return xType.isArray(); } public boolean isCollection() { - return propertyTypeExtractor.isCollection(); + return xType.isCollection(); } public int getModifiers() { return getMember().getModifiers(); } + public final boolean isTypeResolved() { + return xType.isResolved(); + } + public void setAccessible(boolean accessible) { ( (AccessibleObject) getMember() ).setAccessible( accessible ); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -15,14 +15,12 @@ static JavaXMethod create(Member member, TypeEnvironment context, JavaXFactory factory) { final Type propType = typeOf( member, context ); - PropertyTypeExtractor typeExtractor = factory.buildTypeExtractor( context, propType ); - if( typeExtractor == null ) - return null; - return new JavaXMethod( member, propType, context, factory, typeExtractor); + JavaXType xType = factory.toXType( context, propType ); + return new JavaXMethod( member, propType, context, factory, xType); } - private JavaXMethod(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { - super(member, type, env, factory, propertyTypeExtractor); + private JavaXMethod(Member member, Type type, TypeEnvironment env, JavaXFactory factory, JavaXType xType) { + super(member, type, env, factory, xType); assert member instanceof Method; } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -42,12 +42,12 @@ static JavaXProperty create(Member member, final TypeEnvironment context, final JavaXFactory factory) { final Type propType = typeOf( member, context ); - PropertyTypeExtractor typeExtractor = factory.buildTypeExtractor( context, propType ); - return new JavaXProperty( member, propType, context, factory, typeExtractor ); + JavaXType xType = factory.toXType( context, propType ); + return new JavaXProperty( member, propType, context, factory, xType ); } - private JavaXProperty(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { - super(member, type, env, factory, propertyTypeExtractor); + private JavaXProperty(Member member, Type type, TypeEnvironment env, JavaXFactory factory, JavaXType xType) { + super(member, type, env, factory, xType); assert member instanceof Field || member instanceof Method; } @@ -84,8 +84,9 @@ throw new IllegalStateException( "Unable to invoke " + getName(), e ); } } - - public boolean isTypeResolved() { - return TypeUtils.isFullyResolved( env.bind( type ) ); + + @Override + public String toString() { + return getName(); } } \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,46 @@ +package org.hibernate.reflection.java; + +import java.lang.reflect.Type; +import java.util.Collection; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; + +/** + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +class JavaXSimpleType extends JavaXType { + + public JavaXSimpleType(Type type, TypeEnvironment context, JavaXFactory factory) { + super( type, context, factory ); + } + + public boolean isArray() { + return false; + } + + public boolean isCollection() { + return false; + } + + public XClass getElementClass() { + return toXClass( resolve() ); + } + + public XClass getClassOrElementClass() { + return getElementClass(); + } + + public Class<? extends Collection> getCollectionClass() { + return null; + } + + public XClass getType() { + return toXClass( resolve() ); + } + + public XClass getMapKey() { + return null; + } +} \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,50 @@ +//$Id: PropertyTypeExtractor.java 9316 2006-02-22 20:47:31Z epbernard $ +package org.hibernate.reflection.java; + +import java.lang.reflect.Type; +import java.util.Collection; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeUtils; + +/** + * The Java X-layer equivalent to a Java <code>Type</code>. + * + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +abstract class JavaXType { + + private final Type unboundType; + private final TypeEnvironment context; + private final TypeEnvironment approximatingContext; + private final JavaXFactory factory; + + protected JavaXType( Type unboundType, TypeEnvironment context, JavaXFactory factory ) { + this.unboundType = unboundType; + this.context = context; + this.approximatingContext = factory.toApproximatingEnvironment( context ); + this.factory = factory; + } + + abstract public boolean isArray(); + abstract public boolean isCollection(); + abstract public XClass getElementClass(); + abstract public XClass getClassOrElementClass(); + abstract public Class<? extends Collection> getCollectionClass(); + abstract public XClass getMapKey(); + abstract public XClass getType(); + + public boolean isResolved() { + return TypeUtils.isResolved( context.bind( unboundType ) ); + } + + protected Type resolve() { + return approximatingContext.bind( unboundType ); + } + + protected XClass toXClass(Type type) { + return factory.toXClass( type, context ); + } +} Deleted: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -1,18 +0,0 @@ -//$Id$ -package org.hibernate.reflection.java; - -import java.util.Collection; - -import org.hibernate.reflection.XClass; - -/** - * @author Emmanuel Bernard - */ -interface PropertyTypeExtractor { - boolean isArray(); - boolean isCollection(); - XClass getElementClass(); - XClass getClassOrElementClass(); - Class<? extends Collection> getCollectionClass(); - XClass getType(); -} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -8,8 +8,7 @@ import java.lang.reflect.WildcardType; /** - * A <code>TypeEnvironment</code> decorator that always binds all the generic components of the given type. - * When this is not possible, it approximates the "unbindable" components to their nearest upper binding. + * A <code>TypeEnvironment</code> that approximates the unresolved components of a <code>Type</code> to their nearest upper binding. * <p> * For example:<br> * <code>T</code> becomes <code>Object</code>.<br> @@ -20,23 +19,17 @@ * If a wildcard or type variable has multiple upper bounds, it will be approximated to Object. * Information on lower bounds is discarded during approximation.<p> * - * Array of a generic type is approximated to an array of <code>Object</code>s. Example:<br> - * <code>List<T>[]</code> becomes <code>Object[]</code>. + * An generic array is always approximated to an array of <code>Object</code>s. Example:<br> + * <code>List<T>[]</code> becomes <code>Object[]</code>. This is sub-optimal, but a finer + * approximations has implementation problems. * * @return a type where the generic arguments have been replaced by raw classes. * * @author Paolo Perrotta */ -public class ApproximatingTypeEnvironment implements TypeEnvironment { +class ApproximatingTypeEnvironment implements TypeEnvironment { - private final TypeEnvironment decoratedTypeEnvironment; - - public ApproximatingTypeEnvironment(TypeEnvironment decoratedTypeEnvironment) { - this.decoratedTypeEnvironment = decoratedTypeEnvironment; - } - public Type bind(final Type type) { - Type unboundResult = decoratedTypeEnvironment.bind( type ); Type result = new TypeSwitch<Type>() { public Type caseWildcardType(WildcardType wildcardType) { return collapseToUpperBound( wildcardType.getUpperBounds() ); @@ -49,7 +42,7 @@ @Override public Type caseGenericArrayType(GenericArrayType genericArrayType) { - if( TypeUtils.isFullyResolved( genericArrayType ) ) + if( TypeUtils.isResolved( genericArrayType ) ) return genericArrayType; Type componentType = genericArrayType.getGenericComponentType(); Type boundComponentType = bind( componentType ); @@ -60,7 +53,7 @@ @Override public Type caseParameterizedType(ParameterizedType parameterizedType) { - if( TypeUtils.isFullyResolved( parameterizedType ) ) + if( TypeUtils.isResolved( parameterizedType ) ) return parameterizedType; Type[] typeArguments = parameterizedType.getActualTypeArguments(); Type[] boundTypeArguments = new Type[typeArguments.length]; @@ -84,8 +77,8 @@ public Type defaultCase(Type t) { throw new IllegalArgumentException( "Unknown subclass of Type: " + t.getClass() ); } - }.doSwitch( unboundResult ); - assert TypeUtils.isFullyResolved( result ); + }.doSwitch( type ); + assert TypeUtils.isResolved( result ); return result; } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -30,6 +30,10 @@ return doGetEnvironment( context ); } + public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) { + return new CompoundTypeEnvironment( new ApproximatingTypeEnvironment(), context ); + } + private TypeEnvironment doGetEnvironment(Type context) { if ( context == null ) return IdentityTypeEnvironment.INSTANCE; Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -7,9 +7,12 @@ import java.lang.reflect.WildcardType; import java.util.Collection; +/** + * @author Paolo Perrotta + */ public class TypeUtils { - public static boolean isFullyResolved(Type t) { + public static boolean isResolved(Type t) { return new TypeSwitch<Boolean>() { @Override public Boolean caseClass(Class classType) { @@ -18,16 +21,16 @@ @Override public Boolean caseGenericArrayType(GenericArrayType genericArrayType) { - return isFullyResolved( genericArrayType.getGenericComponentType() ); + return isResolved( genericArrayType.getGenericComponentType() ); } @Override public Boolean caseParameterizedType(ParameterizedType parameterizedType) { Type[] typeArgs = parameterizedType.getActualTypeArguments(); for ( Type arg : typeArgs ) - if( !isFullyResolved( arg )) + if( !isResolved( arg )) return false; - return isFullyResolved( parameterizedType.getRawType() ); + return isResolved( parameterizedType.getRawType() ); } @Override Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -171,6 +171,8 @@ } } ); for ( XProperty field : fields ) { + if( !field.isTypeResolved() ) + throw new IllegalStateException( "Couldn't bind the type of property field " + field ); createMemberValidator( field ); createChildValidator( resourceBundle, field, field.getType() ); } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -63,11 +63,10 @@ assertEquals( 1, fieldProperties.size() ); } - // TODO: uncomment ASAP -// public void testExtractsPublicMethodsAsProperties() { -// List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); -// assertEquals( 7, methodProperties.size() ); -// } + public void testExtractsPublicMethodsAsProperties() { + List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); + assertEquals( 7, methodProperties.size() ); + } public void testCanBeAbstract() { assertFalse( clazz.isAbstract() ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -43,21 +43,20 @@ assertEquals( "fieldProperty", field.getName() ); } - // TODO: uncomment ASAP -// public void testReturnsPropertiesWithUnresolvedParametricTypes() { -// assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() ); -// } -// -// public void testKnowsWhetherItsTypesAreFullyResolved() { -// XProperty notFullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromItself -// .getDeclaredProperties( "property" ) ); -// assertFalse( notFullyResolvedProperty.isTypeResolved() ); -// XProperty fullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromSon -// .getDeclaredProperties( "property" ) ); -// assertTrue( fullyResolvedProperty.isTypeResolved() ); -// } + public void testReturnsPropertiesWithUnresolvedParametricTypes() { + assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() ); + } - public void testPropertiesFiltered() { + public void testKnowsWhetherItsTypeIsFullyResolved() { + XProperty notFullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromItself + .getDeclaredProperties( "property" ) ); + assertFalse( notFullyResolvedProperty.isTypeResolved() ); + XProperty fullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromSon + .getDeclaredProperties( "property" ) ); + assertTrue( fullyResolvedProperty.isTypeResolved() ); + } + + public void testCanBeFiltered() { assertEquals( 8, dadAsSeenFromSon.getDeclaredProperties( "property", new Filter() { public boolean returnStatic() { @@ -88,6 +87,7 @@ assertTrue( factory.equals( p.getElementClass(), String.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); + assertNull( p.getMapKey() ); assertFalse( p.isArray() ); assertFalse( p.isCollection() ); } @@ -99,6 +99,7 @@ assertTrue( factory.equals( p.getElementClass(), String.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); + assertNull( p.getMapKey() ); assertTrue( p.isArray() ); assertFalse( p.isCollection() ); } @@ -110,17 +111,18 @@ assertTrue( factory.equals( p.getElementClass(), int.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), int.class ) ); assertNull( p.getCollectionClass() ); + assertNull( p.getMapKey() ); assertTrue( p.isArray() ); assertFalse( p.isCollection() ); } public void testCanBeACollection() { - // TODO we'll need to have access to the XClass key of a map either List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" ); XProperty p = getPropertyNamed_from( "collectionProperty", declaredProperties ); assertTrue( factory.equals( p.getType(), Map.class ) ); assertTrue( factory.equals( p.getElementClass(), String.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), Map.class ) ); + assertTrue( factory.equals( p.getMapKey(), Double.class ) ); assertEquals( Map.class, p.getCollectionClass() ); assertFalse( p.isArray() ); assertTrue( p.isCollection() ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -6,17 +6,17 @@ import junit.framework.TestCase; -import org.hibernate.reflection.java.generics.ApproximatingTypeEnvironment; import org.hibernate.reflection.java.generics.TypeEnvironment; import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; public class ApproximatingTypeEnvironmentTest extends TestCase { - TypeEnvironment unboundContext = new TypeEnvironmentFactory().getEnvironment( BigBlob.class ); - TypeEnvironment approximatingUnboundContext = new ApproximatingTypeEnvironment( unboundContext ); + TypeEnvironmentFactory teFactory = new TypeEnvironmentFactory(); + TypeEnvironment unboundContext = teFactory.getEnvironment( BigBlob.class ); + TypeEnvironment approximatingUnboundContext = teFactory.toApproximatingEnvironment( unboundContext ); - TypeEnvironment boundContext = new TypeEnvironmentFactory().getEnvironment( SonOfBlob.class ); - TypeEnvironment approximatingBoundContext = new ApproximatingTypeEnvironment( boundContext ); + TypeEnvironment boundContext = teFactory.getEnvironment( SonOfBlob.class ); + TypeEnvironment approximatingBoundContext = teFactory.toApproximatingEnvironment( boundContext ); public void testDoesNothingOnClasses() throws SecurityException, NoSuchMethodException { assertEquals( String[].class, approximatingUnboundContext.bind( String[].class ) ); @@ -37,8 +37,8 @@ assertEquals( Object[].class, approximatingUnboundContext.bind( type ) ); } - public void testApproximatesUnboundParameterizedTypes() throws Exception { - Type type = BigBlob.class.getMethod( "genTypeWithWildcards", new Class[0] ).getGenericReturnType(); + public void testApproximatesWildcardsToTheirUpperBound() throws Exception { + Type type = BigBlob.class.getMethod( "genTypeContainingWildcardsWithUpperBounds", new Class[0] ).getGenericReturnType(); ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); assertEquals( Map.class, approxType.getRawType() ); assertNull( approxType.getOwnerType() ); @@ -46,4 +46,13 @@ assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); assertEquals( Comparable.class, approxType.getActualTypeArguments()[1] ); } + + public void testApproximatesWildcardsWithoutUpperBoundsToObject() throws Exception { + Type type = BigBlob.class.getMethod( "genTypeContainingWildcardsWithoutUpperBounds", new Class[0] ).getGenericReturnType(); + ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); + assertEquals( Class.class, approxType.getRawType() ); + assertNull( approxType.getOwnerType() ); + assertEquals( 1, approxType.getActualTypeArguments().length ); + assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); + } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -7,7 +7,9 @@ public List<T> genTypeWithoutWildcards() { return null; } - public Map<T, ? extends Comparable> genTypeWithWildcards() { return null; } + public Map<T, ? extends Comparable> genTypeContainingWildcardsWithUpperBounds() { return null; } + public Class<?> genTypeContainingWildcardsWithoutUpperBounds() { return null; } + public List<T>[] genArrayType() { return null; } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -15,18 +15,18 @@ TypeEnvironment sonContext = env.getEnvironment( Son.class ); public void testAClassIsAlwaysFullyResolved() throws Exception { - assertTrue( TypeUtils.isFullyResolved( Dad.class )); + assertTrue( TypeUtils.isResolved( Dad.class )); } public void testKnowsIfAParametricTypeIsFullyResolved() throws Exception { Type simpleType = Dad.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType(); - assertFalse( TypeUtils.isFullyResolved( dadContext.bind( simpleType )) ); - assertTrue( TypeUtils.isFullyResolved( sonContext.bind( simpleType )) ); + assertFalse( TypeUtils.isResolved( dadContext.bind( simpleType )) ); + assertTrue( TypeUtils.isResolved( sonContext.bind( simpleType )) ); } public void testKnowsIfAnArrayTypeIsFullyResolved() throws Exception { Type arrayType = Dad.class.getMethod( "getArrayProperty", new Class[0] ).getGenericReturnType(); - assertFalse( TypeUtils.isFullyResolved( dadContext.bind( arrayType )) ); - assertTrue( TypeUtils.isFullyResolved( sonContext.bind( arrayType )) ); + assertFalse( TypeUtils.isResolved( dadContext.bind( arrayType )) ); + assertTrue( TypeUtils.isResolved( sonContext.bind( arrayType )) ); } } |
From: <hib...@li...> - 2006-03-07 17:35:05
|
Author: epbernard Date: 2006-03-07 12:34:26 -0500 (Tue, 07 Mar 2006) New Revision: 9568 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ComponentPropertyHolder.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/id/Tower.java Log: ANN-274 Pretty bad solution though Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ComponentPropertyHolder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ComponentPropertyHolder.java 2006-03-07 15:06:09 UTC (rev 9567) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ComponentPropertyHolder.java 2006-03-07 17:34:26 UTC (rev 9568) @@ -1,6 +1,9 @@ //$Id$ package org.hibernate.cfg; +import javax.persistence.Column; +import javax.persistence.JoinColumn; + import org.hibernate.AnnotationException; import org.hibernate.mapping.Component; import org.hibernate.mapping.KeyValue; @@ -71,4 +74,39 @@ public boolean isComponent() { return true; } + + @Override + public Column[] getOverriddenColumn(String propertyName) { + //FIXME this is yukky + Column[] result = super.getOverriddenColumn( propertyName ); + if (result == null) { + String userPropertyName = extractUserPropertyName( "id", propertyName ); + if (userPropertyName != null) result = super.getOverriddenColumn( userPropertyName ); + } + if (result == null) { + String userPropertyName = extractUserPropertyName( "_identifierMapper", propertyName ); + if (userPropertyName != null) result = super.getOverriddenColumn( userPropertyName ); + } + return result; + } + + private String extractUserPropertyName(String redundantString, String propertyName) { + String result = null; + String className = component.getOwner().getClassName(); + if ( propertyName.startsWith( className ) + && propertyName.length() > className.length() + 2 + redundantString.length() // .id. + && propertyName.substring( + className.length() + 1, className.length() + 1 + redundantString.length() + ).equals( redundantString ) + ) { + //remove id we might be in a @IdCLass case + result = className + propertyName.substring( className.length() + 1 + redundantString.length() ); + } + return result; + } + + @Override + public JoinColumn[] getOverriddenJoinColumn(String propertyName) { + return super.getOverriddenJoinColumn( propertyName ); + } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/id/Tower.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/id/Tower.java 2006-03-07 15:06:09 UTC (rev 9567) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/id/Tower.java 2006-03-07 17:34:26 UTC (rev 9568) @@ -2,10 +2,13 @@ package org.hibernate.test.annotations.id; import javax.persistence.Entity; +import javax.persistence.AttributeOverride; +import javax.persistence.Column; /** * @author Emmanuel Bernard */ @Entity +@AttributeOverride(name="longitude", column = @Column(name="fld_longitude")) public class Tower extends MilitaryBuilding { } |
From: <hib...@li...> - 2006-03-07 15:06:13
|
Author: ste...@jb... Date: 2006-03-07 10:06:09 -0500 (Tue, 07 Mar 2006) New Revision: 9567 Modified: trunk/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml Log: test for HHH-1531 Modified: trunk/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml 2006-03-07 15:05:08 UTC (rev 9566) +++ trunk/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml 2006-03-07 15:06:09 UTC (rev 9567) @@ -72,7 +72,7 @@ <class name="Group" table="`Group`"> <id name="name"/> - <set name="users" table="UserGroup"> + <set name="users" table="UserGroup" cascade="save-update"> <key column="groupName"/> <many-to-many column="userId" class="Person" property-ref="userId"/> </set> |
From: <hib...@li...> - 2006-03-07 15:05:13
|
Author: ste...@jb... Date: 2006-03-07 10:05:08 -0500 (Tue, 07 Mar 2006) New Revision: 9566 Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml Log: test for HHH-1531 Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml 2006-03-07 14:29:16 UTC (rev 9565) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/Person.hbm.xml 2006-03-07 15:05:08 UTC (rev 9566) @@ -72,7 +72,7 @@ <class name="Group" table="`Group`"> <id name="name"/> - <set name="users" table="UserGroup"> + <set name="users" table="UserGroup" cascade="save-update"> <key column="groupName"/> <many-to-many column="userId" class="Person" property-ref="userId"/> </set> |
From: <hib...@li...> - 2006-03-07 14:29:21
|
Author: ste...@jb... Date: 2006-03-07 09:29:16 -0500 (Tue, 07 Mar 2006) New Revision: 9565 Modified: trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java Log: tests for caching of dynamic instantiation query results Modified: trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java 2006-03-07 14:24:58 UTC (rev 9564) +++ trunk/Hibernate3/test/org/hibernate/test/hql/ASTParserLoadingTest.java 2006-03-07 14:29:16 UTC (rev 9565) @@ -22,7 +22,9 @@ import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.QueryException; +import org.hibernate.stat.QueryStatistics; import org.hibernate.cfg.Environment; +import org.hibernate.cfg.Configuration; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.MySQLDialect; @@ -54,6 +56,11 @@ private List createdAnimalIds = new ArrayList(); + public static Test suite() { + TestSuite suite = new TestSuite( ASTParserLoadingTest.class ); + return suite; + } + protected String[] getMappings() { // Make sure we are using the new AST parser translator... System.setProperty( Environment.QUERY_TRANSLATOR, "org.hibernate.hql.ast.ASTQueryTranslatorFactory" ); @@ -68,6 +75,12 @@ }; } + protected void configure(Configuration cfg) { + super.configure( cfg ); + cfg.setProperty( Environment.USE_QUERY_CACHE, "true" ); + cfg.setProperty( Environment.GENERATE_STATISTICS, "true" ); + } + public void testCollectionJoinsInSubselect() { // HHH-1248 : initially FromElementFactory treated any explicit join // as an implied join so that theta-style joins would always be used. @@ -702,7 +715,9 @@ String[] dp1 = StringHelper.split("-", dateStr1); String[] dp2 = StringHelper.split("-", dateStr2); for (int i=0; i<3; i++) { - if ( dp1[i].startsWith("0") ) dp1[i] = dp1[i].substring(1); + if ( dp1[i].startsWith( "0" ) ) { + dp1[i] = dp1[i].substring( 1 ); + } assertEquals( dp1[i], dp2[i] ); } } @@ -712,7 +727,9 @@ } public void testCast() { - if ( (getDialect() instanceof MySQLDialect) || (getDialect() instanceof DB2Dialect) ) return; + if ( ( getDialect() instanceof MySQLDialect ) || ( getDialect() instanceof DB2Dialect ) ) { + return; + } Session session = openSession(); Transaction txn = session.beginTransaction(); session.createQuery("from Human h where h.nickName like 'G%'").list(); @@ -1123,6 +1140,21 @@ assertTrue( "Incorrect return type", sr.get(0) instanceof Animal ); sr.close(); + // caching... + QueryStatistics stats = getSessions().getStatistics().getQueryStatistics( "select new Animal(an.description, an.bodyWeight) from Animal an" ); + results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ) + .setCacheable( true ) + .list(); + assertEquals( "incorrect result size", 2, results.size() ); + assertClassAssignability( Animal.class, results.get( 0 ).getClass() ); + long initCacheHits = stats.getCacheHitCount(); + results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ) + .setCacheable( true ) + .list(); + assertEquals( "dynamic intantiation query not served from cache", initCacheHits + 1, stats.getCacheHitCount() ); + assertEquals( "incorrect result size", 2, results.size() ); + assertClassAssignability( Animal.class, results.get( 0 ).getClass() ); + session.close(); destroyTestBaseData(); @@ -1218,14 +1250,6 @@ session.close(); } - - private void assertResultSize(String hql, int size) { - Session session = openSession(); - Transaction txn = session.beginTransaction(); - assertEquals( size, session.createQuery(hql).list().size() ); - txn.commit(); - session.close(); - } public void testSubselectBetween() { assertResultSize("from Animal x where (select max(a.bodyWeight) from Animal a) in (1,2,3)", 0); @@ -1234,10 +1258,13 @@ assertResultSize("from Animal x where (select max(a.bodyWeight) from Animal a) is not null", 0); assertResultSize("from Animal x where exists (select max(a.bodyWeight) from Animal a)", 0); } - - public static Test suite() { - TestSuite suite = new TestSuite( ASTParserLoadingTest.class ); - return suite; + + private void assertResultSize(String hql, int size) { + Session session = openSession(); + Transaction txn = session.beginTransaction(); + assertEquals( size, session.createQuery(hql).list().size() ); + txn.commit(); + session.close(); } } |
From: <hib...@li...> - 2006-03-07 14:25:06
|
Author: ste...@jb... Date: 2006-03-07 09:24:58 -0500 (Tue, 07 Mar 2006) New Revision: 9564 Modified: trunk/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java Log: test for HHH-1531 Modified: trunk/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java 2006-03-07 14:24:47 UTC (rev 9563) +++ trunk/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java 2006-03-07 14:24:58 UTC (rev 9564) @@ -28,28 +28,40 @@ } public void testManyToManyPropertyRef() { + // prepare some test data relating to the Group->Person many-to-many association Session s = openSession(); Transaction t = s.beginTransaction(); Person p = new Person(); - p.setName("Steve"); - p.setUserId("steve"); - s.persist(p); + p.setName( "Steve" ); + p.setUserId( "steve" ); + s.persist( p ); + Group g = new Group(); + g.setName( "Admins" ); + g.getUsers().add( p ); + s.persist( g ); + // force a flush and detachment here to test reattachment handling of the property-ref (HHH-1531) + t.commit(); + s.close(); + Person p2 = new Person(); - p2.setName("Max"); - p2.setUserId("max"); - s.persist(p2); - Group g = new Group(); - g.setName("Admins"); - g.getUsers().add(p); - g.getUsers().add(p2); - s.persist(g); - s.flush(); - s.clear(); - g = (Group) s.createQuery("from Group g left join fetch g.users").uniqueResult(); + p2.setName( "Max" ); + p2.setUserId( "max" ); + g.getUsers().add( p2 ); + + s = openSession(); + t = s.beginTransaction(); + s.update( g ); + t.commit(); + s.close(); + + // test retrieval of the group + s = openSession(); + t = s.beginTransaction(); + g = ( Group ) s.createQuery( "from Group g left join fetch g.users" ).uniqueResult(); assertTrue( Hibernate.isInitialized( g.getUsers() ) ); assertEquals( 2, g.getUsers().size() ); - s.delete(g); - s.createQuery("delete Person").executeUpdate(); + s.delete( g ); + s.createQuery( "delete Person" ).executeUpdate(); t.commit(); s.close(); } |
From: <hib...@li...> - 2006-03-07 14:24:49
|
Author: ste...@jb... Date: 2006-03-07 09:24:47 -0500 (Tue, 07 Mar 2006) New Revision: 9563 Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java Log: test for HHH-1531 Modified: branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java =================================================================== --- branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java 2006-03-07 14:24:13 UTC (rev 9562) +++ branches/Branch_3_1/Hibernate3/test/org/hibernate/test/propertyref/PropertyRefTest.java 2006-03-07 14:24:47 UTC (rev 9563) @@ -26,30 +26,42 @@ public PropertyRefTest(String str) { super(str); } - + public void testManyToManyPropertyRef() { + // prepare some test data relating to the Group->Person many-to-many association Session s = openSession(); Transaction t = s.beginTransaction(); Person p = new Person(); - p.setName("Steve"); - p.setUserId("steve"); - s.persist(p); + p.setName( "Steve" ); + p.setUserId( "steve" ); + s.persist( p ); + Group g = new Group(); + g.setName( "Admins" ); + g.getUsers().add( p ); + s.persist( g ); + // force a flush and detachment here to test reattachment handling of the property-ref (HHH-1531) + t.commit(); + s.close(); + Person p2 = new Person(); - p2.setName("Max"); - p2.setUserId("max"); - s.persist(p2); - Group g = new Group(); - g.setName("Admins"); - g.getUsers().add(p); - g.getUsers().add(p2); - s.persist(g); - s.flush(); - s.clear(); - g = (Group) s.createQuery("from Group g left join fetch g.users").uniqueResult(); + p2.setName( "Max" ); + p2.setUserId( "max" ); + g.getUsers().add( p2 ); + + s = openSession(); + t = s.beginTransaction(); + s.update( g ); + t.commit(); + s.close(); + + // test retrieval of the group + s = openSession(); + t = s.beginTransaction(); + g = ( Group ) s.createQuery( "from Group g left join fetch g.users" ).uniqueResult(); assertTrue( Hibernate.isInitialized( g.getUsers() ) ); assertEquals( 2, g.getUsers().size() ); - s.delete(g); - s.createQuery("delete Person").executeUpdate(); + s.delete( g ); + s.createQuery( "delete Person" ).executeUpdate(); t.commit(); s.close(); } |
From: <hib...@li...> - 2006-03-07 14:24:19
|
Author: ste...@jb... Date: 2006-03-07 09:24:13 -0500 (Tue, 07 Mar 2006) New Revision: 9562 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java Log: HHH-1531; plus other potential issues with property-ref Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java 2006-03-07 14:17:16 UTC (rev 9561) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java 2006-03-07 14:24:13 UTC (rev 9562) @@ -9,230 +9,313 @@ import org.hibernate.type.Type; /** - * Helper methods for rendering log messages and exception + * MessageHelper methods for rendering log messages relating to managed + * entities and collections typically used in log statements and exception * messages. + * * @author Max Andersen, Gavin King */ public final class MessageHelper { - private MessageHelper() {} + private MessageHelper() { + } + + // entities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + /** + * Generate an info message string relating to a particular entity, + * based on the given entityName and id. + * + * @param entityName The defined entity name. + * @param id The entity id value. + * @return An info string, in the form [FooBar#1]. + */ public static String infoString(String entityName, Serializable id) { StringBuffer s = new StringBuffer(); - s.append('['); - if(entityName==null) { - s.append("<null entity name>"); + s.append( '[' ); + if( entityName == null ) { + s.append( "<null entity name>" ); } else { - s.append(entityName); + s.append( entityName ); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append(id); + s.append( id ); } - s.append(']'); + s.append( ']' ); return s.toString(); } /** - * Generate small message that can be used in traces and exception - * messages. - * @param persister The persister for the class in question - * @param id The id - * @return String on the form [FooBar#id] + * Generate an info message string relating to a particular entity. + * + * @param persister The persister for the entity + * @param id The entity id value + * @param factory The session factory + * @return An info string, in the form [FooBar#1] */ public static String infoString( - EntityPersister persister, - Object id, - SessionFactoryImplementor factory - ) { + EntityPersister persister, + Object id, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + Type idType; + if( persister == null ) { + s.append( "<null EntityPersister>" ); + idType = null; } else { s.append( persister.getEntityName() ); + idType = persister.getIdentifierType(); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( persister.getIdentifierType().toLoggableString(id, factory) ); + if ( idType == null ) { + s.append( id ); + } + else { + s.append( idType.toLoggableString( id, factory ) ); + } } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to a particular entity,. + * + * @param persister The persister for the entity + * @param id The entity id value + * @param identifierType The entity identifier type mapping + * @param factory The session factory + * @return An info string, in the form [FooBar#1] + */ public static String infoString( - EntityPersister persister, - Object id, + EntityPersister persister, + Object id, Type identifierType, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if( persister == null ) { + s.append( "<null EntityPersister>" ); } else { s.append( persister.getEntityName() ); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( identifierType.toLoggableString(id, factory) ); + s.append( identifierType.toLoggableString( id, factory ) ); } - s.append(']'); + s.append( ']' ); return s.toString(); - } + /** + * Generate an info message string relating to a series of entities. + * + * @param persister The persister for the entities + * @param ids The entity id values + * @param factory The session factory + * @return An info string, in the form [FooBar#<1,2,3>] + */ public static String infoString( - EntityPersister persister, - Serializable[] ids, - SessionFactoryImplementor factory - ) { + EntityPersister persister, + Serializable[] ids, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if( persister == null ) { + s.append( "<null EntityPersister>" ); } else { - s.append( persister.getEntityName() ) - .append("#<"); - + s.append( persister.getEntityName() ); + s.append( "#<" ); for ( int i=0; i<ids.length; i++ ) { s.append( persister.getIdentifierType().toLoggableString( ids[i], factory ) ); - if ( i<ids.length-1 ) s.append(", "); + if ( i < ids.length-1 ) { + s.append( ", " ); + } } - s.append('>'); + s.append( '>' ); } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to given entity persister. + * + * @param persister The persister. + * @return An info string, in the form [FooBar] + */ public static String infoString(EntityPersister persister) { StringBuffer s = new StringBuffer(); - s.append('['); - if (persister == null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<null EntityPersister>" ); } else { s.append( persister.getEntityName() ); } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to a given property value + * for an entity. + * + * @param entityName The entity name + * @param propertyName The name of the property + * @param key The property value. + * @return An info string, in the form [Foo.bars#1] + */ + public static String infoString(String entityName, String propertyName, Object key) { + StringBuffer s = new StringBuffer() + .append( '[' ) + .append( entityName ) + .append( '.' ) + .append( propertyName ) + .append( '#' ); + + if ( key == null ) { + s.append( "<null>" ); + } + else { + s.append( key ); + } + s.append( ']' ); + return s.toString(); + } + + + // collections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + /** + * Generate an info message string relating to a series of managed + * collections. + * + * @param persister The persister for the collections + * @param ids The id values of the owners + * @param factory The session factory + * @return An info string, in the form [Foo.bars#<1,2,3>] + */ public static String collectionInfoString( - CollectionPersister persister, - Serializable[] ids, - SessionFactoryImplementor factory - ) { + CollectionPersister persister, + Serializable[] ids, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if (persister==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<unreferenced>" ); } else { - s.append( persister.getRole() ) - .append("#<"); - - for ( int i=0; i<ids.length; i++ ) { - s.append( persister.getKeyType().toLoggableString( ids[i], factory ) ); - if ( i<ids.length-1 ) s.append(", "); + s.append( persister.getRole() ); + s.append( "#<" ); + for ( int i = 0; i < ids.length; i++ ) { + // Need to use the identifier type of the collection owner + // since the incoming is value is actually the owner's id. + // Using the collection's key type causes problems with + // property-ref keys... + s.append( persister.getOwnerEntityPersister().getIdentifierType().toLoggableString( ids[i], factory ) ); + if ( i < ids.length-1 ) { + s.append( ", " ); + } } - s.append('>'); + s.append( '>' ); } - s.append(']'); - + s.append( ']' ); return s.toString(); + } - } - + /** + * Generate an info message string relating to a particular managed + * collection. + * + * @param persister The persister for the collection + * @param id The id value of the owner + * @param factory The session factory + * @return An info string, in the form [Foo.bars#1] + */ public static String collectionInfoString( - CollectionPersister persister, - Serializable id, - SessionFactoryImplementor factory - ) { + CollectionPersister persister, + Serializable id, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<unreferenced>" ); } else { s.append( persister.getRole() ); - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( persister.getKeyType().toLoggableString(id, factory) ); + // Need to use the identifier type of the collection owner + // since the incoming is value is actually the owner's id. + // Using the collection's key type causes problems with + // property-ref keys... + s.append( persister.getOwnerEntityPersister().getIdentifierType().toLoggableString( id, factory ) ); } } - s.append(']'); + s.append( ']' ); return s.toString(); - } + /** + * Generate an info message string relating to a particular managed + * collection. + * + * @param role The role-name of the collection + * @param id The id value of the owner + * @return An info string, in the form [Foo.bars#1] + */ public static String collectionInfoString(String role, Serializable id) { StringBuffer s = new StringBuffer(); - s.append('['); - if(role==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if( role == null ) { + s.append( "<unreferenced>" ); } else { - s.append(role); - s.append('#'); + s.append( role ); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append(id); + s.append( id ); } } - s.append(']'); - + s.append( ']' ); return s.toString(); - } - public static String infoString(String entityName, String propertyName, Object key) { - StringBuffer s = new StringBuffer() - .append('[') - .append(entityName) - .append('.') - .append(propertyName) - .append('#'); - - if (key==null) { - s.append("<null>"); - } - else { - s.append(key); - } - s.append(']'); - - return s.toString(); - } - } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java 2006-03-07 14:17:16 UTC (rev 9561) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java 2006-03-07 14:24:13 UTC (rev 9562) @@ -301,7 +301,13 @@ // later in the mapping document) - now, we could try and use e.getStatus() // to decide to semiResolve(), trouble is that initializeEntity() reuses // the same array for resolved and hydrated values - Object id = entityEntry.getLoadedValue( foreignKeyPropertyName ); + Object id; + if ( entityEntry.getLoadedState() != null ) { + id = entityEntry.getLoadedValue( foreignKeyPropertyName ); + } + else { + id = entityEntry.getPersister().getPropertyValue( owner, foreignKeyPropertyName, session.getEntityMode() ); + } // NOTE VERY HACKISH WORKAROUND!! Type keyType = getPersister( session ).getKeyType(); |
From: <hib...@li...> - 2006-03-07 14:17:23
|
Author: ste...@jb... Date: 2006-03-07 09:17:16 -0500 (Tue, 07 Mar 2006) New Revision: 9561 Modified: trunk/Hibernate3/src/org/hibernate/pretty/MessageHelper.java trunk/Hibernate3/src/org/hibernate/type/CollectionType.java Log: HHH-1531; plus other potential issues with property-ref Modified: trunk/Hibernate3/src/org/hibernate/pretty/MessageHelper.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/pretty/MessageHelper.java 2006-03-07 11:36:38 UTC (rev 9560) +++ trunk/Hibernate3/src/org/hibernate/pretty/MessageHelper.java 2006-03-07 14:17:16 UTC (rev 9561) @@ -9,230 +9,313 @@ import org.hibernate.type.Type; /** - * FieldInterceptionHelper methods for rendering log messages and exception + * MessageHelper methods for rendering log messages relating to managed + * entities and collections typically used in log statements and exception * messages. + * * @author Max Andersen, Gavin King */ public final class MessageHelper { - private MessageHelper() {} + private MessageHelper() { + } + + // entities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + /** + * Generate an info message string relating to a particular entity, + * based on the given entityName and id. + * + * @param entityName The defined entity name. + * @param id The entity id value. + * @return An info string, in the form [FooBar#1]. + */ public static String infoString(String entityName, Serializable id) { StringBuffer s = new StringBuffer(); - s.append('['); - if(entityName==null) { - s.append("<null entity name>"); + s.append( '[' ); + if( entityName == null ) { + s.append( "<null entity name>" ); } else { - s.append(entityName); + s.append( entityName ); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append(id); + s.append( id ); } - s.append(']'); + s.append( ']' ); return s.toString(); } /** - * Generate small message that can be used in traces and exception - * messages. - * @param persister The persister for the class in question - * @param id The id - * @return String on the form [FooBar#id] + * Generate an info message string relating to a particular entity. + * + * @param persister The persister for the entity + * @param id The entity id value + * @param factory The session factory + * @return An info string, in the form [FooBar#1] */ public static String infoString( EntityPersister persister, Object id, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + Type idType; + if( persister == null ) { + s.append( "<null EntityPersister>" ); + idType = null; } else { s.append( persister.getEntityName() ); + idType = persister.getIdentifierType(); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( persister.getIdentifierType().toLoggableString(id, factory) ); + if ( idType == null ) { + s.append( id ); + } + else { + s.append( idType.toLoggableString( id, factory ) ); + } } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to a particular entity,. + * + * @param persister The persister for the entity + * @param id The entity id value + * @param identifierType The entity identifier type mapping + * @param factory The session factory + * @return An info string, in the form [FooBar#1] + */ public static String infoString( EntityPersister persister, Object id, Type identifierType, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if( persister == null ) { + s.append( "<null EntityPersister>" ); } else { s.append( persister.getEntityName() ); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( identifierType.toLoggableString(id, factory) ); + s.append( identifierType.toLoggableString( id, factory ) ); } - s.append(']'); + s.append( ']' ); return s.toString(); - } + /** + * Generate an info message string relating to a series of entities. + * + * @param persister The persister for the entities + * @param ids The entity id values + * @param factory The session factory + * @return An info string, in the form [FooBar#<1,2,3>] + */ public static String infoString( EntityPersister persister, Serializable[] ids, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if( persister == null ) { + s.append( "<null EntityPersister>" ); } else { - s.append( persister.getEntityName() ) - .append("#<"); - + s.append( persister.getEntityName() ); + s.append( "#<" ); for ( int i=0; i<ids.length; i++ ) { s.append( persister.getIdentifierType().toLoggableString( ids[i], factory ) ); - if ( i<ids.length-1 ) s.append(", "); + if ( i < ids.length-1 ) { + s.append( ", " ); + } } - s.append('>'); + s.append( '>' ); } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to given entity persister. + * + * @param persister The persister. + * @return An info string, in the form [FooBar] + */ public static String infoString(EntityPersister persister) { StringBuffer s = new StringBuffer(); - s.append('['); - if (persister == null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<null EntityPersister>" ); } else { s.append( persister.getEntityName() ); } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to a given property value + * for an entity. + * + * @param entityName The entity name + * @param propertyName The name of the property + * @param key The property value. + * @return An info string, in the form [Foo.bars#1] + */ + public static String infoString(String entityName, String propertyName, Object key) { + StringBuffer s = new StringBuffer() + .append( '[' ) + .append( entityName ) + .append( '.' ) + .append( propertyName ) + .append( '#' ); + + if ( key == null ) { + s.append( "<null>" ); + } + else { + s.append( key ); + } + s.append( ']' ); + return s.toString(); + } + + + // collections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + /** + * Generate an info message string relating to a series of managed + * collections. + * + * @param persister The persister for the collections + * @param ids The id values of the owners + * @param factory The session factory + * @return An info string, in the form [Foo.bars#<1,2,3>] + */ public static String collectionInfoString( CollectionPersister persister, Serializable[] ids, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if (persister==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<unreferenced>" ); } else { - s.append( persister.getRole() ) - .append("#<"); - - for ( int i=0; i<ids.length; i++ ) { - s.append( persister.getKeyType().toLoggableString( ids[i], factory ) ); - if ( i<ids.length-1 ) s.append(", "); + s.append( persister.getRole() ); + s.append( "#<" ); + for ( int i = 0; i < ids.length; i++ ) { + // Need to use the identifier type of the collection owner + // since the incoming is value is actually the owner's id. + // Using the collection's key type causes problems with + // property-ref keys... + s.append( persister.getOwnerEntityPersister().getIdentifierType().toLoggableString( ids[i], factory ) ); + if ( i < ids.length-1 ) { + s.append( ", " ); + } } - s.append('>'); + s.append( '>' ); } - s.append(']'); - + s.append( ']' ); return s.toString(); + } - } - + /** + * Generate an info message string relating to a particular managed + * collection. + * + * @param persister The persister for the collection + * @param id The id value of the owner + * @param factory The session factory + * @return An info string, in the form [Foo.bars#1] + */ public static String collectionInfoString( CollectionPersister persister, Serializable id, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<unreferenced>" ); } else { s.append( persister.getRole() ); - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( persister.getKeyType().toLoggableString(id, factory) ); + // Need to use the identifier type of the collection owner + // since the incoming is value is actually the owner's id. + // Using the collection's key type causes problems with + // property-ref keys... + s.append( persister.getOwnerEntityPersister().getIdentifierType().toLoggableString( id, factory ) ); } } - s.append(']'); + s.append( ']' ); return s.toString(); - } + /** + * Generate an info message string relating to a particular managed + * collection. + * + * @param role The role-name of the collection + * @param id The id value of the owner + * @return An info string, in the form [Foo.bars#1] + */ public static String collectionInfoString(String role, Serializable id) { StringBuffer s = new StringBuffer(); - s.append('['); - if(role==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if( role == null ) { + s.append( "<unreferenced>" ); } else { - s.append(role); - s.append('#'); + s.append( role ); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append(id); + s.append( id ); } } - s.append(']'); - + s.append( ']' ); return s.toString(); - } - public static String infoString(String entityName, String propertyName, Object key) { - StringBuffer s = new StringBuffer() - .append('[') - .append(entityName) - .append('.') - .append(propertyName) - .append('#'); - - if (key==null) { - s.append("<null>"); - } - else { - s.append(key); - } - s.append(']'); - - return s.toString(); - } - } Modified: trunk/Hibernate3/src/org/hibernate/type/CollectionType.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/type/CollectionType.java 2006-03-07 11:36:38 UTC (rev 9560) +++ trunk/Hibernate3/src/org/hibernate/type/CollectionType.java 2006-03-07 14:17:16 UTC (rev 9561) @@ -301,7 +301,13 @@ // later in the mapping document) - now, we could try and use e.getStatus() // to decide to semiResolve(), trouble is that initializeEntity() reuses // the same array for resolved and hydrated values - Object id = entityEntry.getLoadedValue( foreignKeyPropertyName ); + Object id; + if ( entityEntry.getLoadedState() != null ) { + id = entityEntry.getLoadedValue( foreignKeyPropertyName ); + } + else { + id = entityEntry.getPersister().getPropertyValue( owner, foreignKeyPropertyName, session.getEntityMode() ); + } // NOTE VERY HACKISH WORKAROUND!! Type keyType = getPersister( session ).getKeyType(); |
Author: epbernard Date: 2006-03-07 06:36:38 -0500 (Tue, 07 Mar 2006) New Revision: 9560 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/XAnnotatedElementTestCase.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/xml/ Removed: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/XAnnotatedElementTest.java Modified: trunk/HibernateExt/metadata/lib/ejb3-persistence.jar trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java Log: ANN-270 ANN-271 ANN-272 ANN-273 Start of XML overriding engine Modified: trunk/HibernateExt/metadata/lib/ejb3-persistence.jar =================================================================== (Binary files differ) Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -9,6 +9,9 @@ import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.MappedSuperclass; +import javax.persistence.JoinColumn; +import javax.persistence.AssociationOverride; +import javax.persistence.AssociationOverrides; import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XAnnotatedElement; @@ -23,12 +26,14 @@ private PropertyHolder parent; private Map<String, Column[]> holderColumnOverride; private Map<String, Column[]> currentPropertyColumnOverride; + private Map<String, JoinColumn[]> holderJoinColumnOverride; + private Map<String, JoinColumn[]> currentPropertyJoinColumnOverride; private String path; public AbstractPropertyHolder(String path, PropertyHolder parent, XClass clazzToProcess) { this.path = path; this.parent = parent; - this.holderColumnOverride = buildHierarchyColumnOverride( clazzToProcess ); + buildHierarchyColumnOverride( clazzToProcess ); } public String getPath() { @@ -41,6 +46,7 @@ protected void setCurrentProperty(XProperty property) { if (property == null) { this.currentPropertyColumnOverride = null; + this.currentPropertyJoinColumnOverride = null; } else { this.currentPropertyColumnOverride = buildColumnOverride( @@ -50,6 +56,13 @@ if (this.currentPropertyColumnOverride.size() == 0) { this.currentPropertyColumnOverride = null; } + this.currentPropertyJoinColumnOverride = buildJoinColumnOverride( + property, + getPath() + ); + if (this.currentPropertyJoinColumnOverride.size() == 0) { + this.currentPropertyJoinColumnOverride = null; + } } } @@ -70,24 +83,46 @@ return override; } - private Map<String, Column[]> buildHierarchyColumnOverride(XClass element) { + /** + * Get column overriding, property first, then parent, then holder + */ + public JoinColumn[] getOverriddenJoinColumn(String propertyName) { + JoinColumn[] override = null; + if (override == null && parent != null) { + override = parent.getOverriddenJoinColumn( propertyName ); + } + if (override == null && currentPropertyJoinColumnOverride != null) { + override = currentPropertyJoinColumnOverride.get( propertyName ); + } + if (override == null && holderJoinColumnOverride != null) { + override = holderJoinColumnOverride.get( propertyName ); + } + return override; + } + + private void buildHierarchyColumnOverride(XClass element) { XClass current = element; Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); + Map<String, JoinColumn[]> joinColumnOverride = new HashMap<String, JoinColumn[]>(); while ( current != null && ! ReflectionManager.INSTANCE.toXClass( Object.class ).equals( current ) ) { if ( current.isAnnotationPresent( Entity.class) || current.isAnnotationPresent( MappedSuperclass.class) || current.isAnnotationPresent( Embeddable.class) ) { //FIXME is embeddable override? Map<String, Column[]> currentOverride = buildColumnOverride( current, getPath() ); + Map<String, JoinColumn[]> currentJoinOverride = buildJoinColumnOverride( current, getPath() ); currentOverride.putAll(columnOverride); //subclasses have precedence over superclasses + currentJoinOverride.putAll(joinColumnOverride); //subclasses have precedence over superclasses columnOverride = currentOverride; + joinColumnOverride = currentJoinOverride; } current = current.getSuperclass(); } - return columnOverride.size() > 0 ? columnOverride : null; + holderColumnOverride = columnOverride.size() > 0 ? columnOverride : null; + holderJoinColumnOverride = joinColumnOverride.size() > 0 ? joinColumnOverride : null; } - private Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) { + private static Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) { Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); if (element == null) return columnOverride; AttributeOverride singleOverride = element.getAnnotation( AttributeOverride.class ); @@ -114,4 +149,32 @@ } return columnOverride; } + + private static Map<String, JoinColumn[]> buildJoinColumnOverride(XAnnotatedElement element, String path) { + Map<String, JoinColumn[]> columnOverride = new HashMap<String, JoinColumn[]>(); + if (element == null) return columnOverride; + AssociationOverride singleOverride = element.getAnnotation( AssociationOverride.class ); + AssociationOverrides multipleOverrides = element.getAnnotation( AssociationOverrides.class ); + AssociationOverride[] overrides; + if ( singleOverride != null ) { + overrides = new AssociationOverride[]{singleOverride}; + } + else if ( multipleOverrides != null ) { + overrides = multipleOverrides.value(); + } + else { + overrides = null; + } + + //fill overriden columns + if ( overrides != null ) { + for ( AssociationOverride depAttr : overrides ) { + columnOverride.put( + StringHelper.qualify( path, depAttr.name() ), + depAttr.joinColumns() + ); + } + } + return columnOverride; + } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -44,6 +44,7 @@ import javax.persistence.TableGenerator; import javax.persistence.Transient; import javax.persistence.Version; +import javax.persistence.SqlResultSetMappings; import net.sf.cglib.transform.impl.InterceptFieldCallback; @@ -187,6 +188,14 @@ QueryBinder.bindSqlResultsetMapping( ann, mappings ); } { + SqlResultSetMappings ann = annotatedElement.getAnnotation( SqlResultSetMappings.class ); + if (ann != null) { + for ( SqlResultSetMapping current : ann.value() ) { + QueryBinder.bindSqlResultsetMapping( current, mappings ); + } + } + } + { NamedQuery ann = annotatedElement.getAnnotation( NamedQuery.class ); QueryBinder.bindQuery( ann, mappings ); } @@ -914,26 +923,23 @@ } //process @JoinColumn(s) before @Column(s) to handle collection of elements properly - if ( property.isAnnotationPresent( JoinColumn.class ) ) { - JoinColumn ann = (JoinColumn) property.getAnnotation( JoinColumn.class ); - joinColumns = new Ejb3JoinColumn[1]; - joinColumns[0] = Ejb3JoinColumn.buildJoinColumn( - ann, - entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings - ); - } - else if ( property.isAnnotationPresent( JoinColumns.class ) ) { - JoinColumns ann = property.getAnnotation( JoinColumns.class ); - JoinColumn[] annColumns = ann.value(); - int length = annColumns.length; - if ( length == 0 ) { - throw new AnnotationException( "Cannot bind an empty @JoinColumns" ); + { + JoinColumn[] anns = null; + if ( property.isAnnotationPresent( JoinColumn.class ) ) { + anns = new JoinColumn[] { property.getAnnotation( JoinColumn.class ) }; } - joinColumns = new Ejb3JoinColumn[length]; - for ( int index = 0; index < length ; index++ ) { - joinColumns[index] = Ejb3JoinColumn.buildJoinColumn( - annColumns[index], - entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings + else if ( property.isAnnotationPresent( JoinColumns.class ) ) { + JoinColumns ann = property.getAnnotation( JoinColumns.class ); + anns = ann.value(); + int length = anns.length; + if ( length == 0 ) { + throw new AnnotationException( "Cannot bind an empty @JoinColumns" ); + } + } + if (anns != null) { + joinColumns = Ejb3JoinColumn.buildJoinColumns( + anns, null, entityBinder.getSecondaryTables(), + propertyHolder, inferredData.getPropertyName(), mappings ); } } @@ -958,7 +964,6 @@ ( property.isAnnotationPresent( ManyToOne.class ) || property.isAnnotationPresent( OneToOne.class ) ) ) { - joinColumns = new Ejb3JoinColumn[1]; if ( property.isAnnotationPresent( JoinTable.class ) ) { JoinTable assocTable = property.getAnnotation( JoinTable.class ); //entityBinder.firstLevelSecondaryTablesBinding(assocTable); @@ -971,7 +976,7 @@ String mappedBy = oneToOneAnn != null ? oneToOneAnn.mappedBy() : null; - joinColumns[0] = Ejb3JoinColumn.buildImplicitJoinColumn( + joinColumns = Ejb3JoinColumn.buildJoinColumns( (JoinColumn[]) null, mappedBy, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings ); @@ -980,12 +985,11 @@ else if ( joinColumns == null && ( property.isAnnotationPresent( OneToMany.class ) || property.isAnnotationPresent( CollectionOfElements.class ) ) ) { - joinColumns = new Ejb3JoinColumn[1]; OneToMany oneToMany = (OneToMany) property.getAnnotation( OneToMany.class ); String mappedBy = oneToMany != null ? oneToMany.mappedBy() : ""; - joinColumns[0] = Ejb3JoinColumn.buildImplicitJoinColumn( + joinColumns = Ejb3JoinColumn.buildJoinColumns( (JoinColumn[]) null, mappedBy, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappings ); @@ -1035,9 +1039,6 @@ //manage composite related metadata Embeddable embeddableAnn = (Embeddable) returnedClass.getAnnotation( Embeddable.class ); - Map<String, Column[]> columnOverride = PropertyHolderBuilder.buildColumnOverride( - property, propertyHolder.getPath() + '.' + inferredData.getPropertyName() - ); //guess if its a component and find id data access (property, field etc) final boolean isComponent = embeddableAnn != null || property.isAnnotationPresent( EmbeddedId.class ); boolean propertyAnnotated = entityBinder.isPropertyAnnotated( returnedClass ); @@ -1379,11 +1380,11 @@ annJoins = null; annInverseJoins = null; } - Ejb3JoinColumn[] joinColumns = buildJoinTableJoinColumns( + Ejb3JoinColumn[] joinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns( annJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappedBy, mappings ); - Ejb3JoinColumn[] inverseJoinColumns = buildJoinTableJoinColumns( + Ejb3JoinColumn[] inverseJoinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns( annInverseJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappedBy, mappings ); @@ -1393,52 +1394,6 @@ collectionBinder.setInverseJoinColumns( inverseJoinColumns ); } - private static Ejb3JoinColumn[] buildJoinTableJoinColumns( - JoinColumn[] annJoins, Map<String, Join> secondaryTables, - PropertyHolder propertyHolder, String propertyName, String mappedBy, ExtendedMappings mappings - ) { - Ejb3JoinColumn[] joinColumns; - if ( annJoins == null ) { - Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); - currentJoinColumn.setImplicit( true ); - currentJoinColumn.setNullable( false ); //I break the spec, but it's for good - currentJoinColumn.setPropertyHolder( propertyHolder ); - currentJoinColumn.setJoins( secondaryTables ); - currentJoinColumn.setMappings( mappings ); - currentJoinColumn.setPropertyName( - BinderHelper.getRelativePath( propertyHolder, propertyName ) - ); - currentJoinColumn.setMappedBy( mappedBy ); - currentJoinColumn.bind(); - - joinColumns = new Ejb3JoinColumn[]{ - currentJoinColumn - - }; - } - else { - joinColumns = new Ejb3JoinColumn[annJoins.length]; - JoinColumn annJoin; - int length = annJoins.length; - for ( int index = 0; index < length ; index++ ) { - annJoin = annJoins[index]; - Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); - currentJoinColumn.setImplicit( true ); - currentJoinColumn.setPropertyHolder( propertyHolder ); - currentJoinColumn.setJoins( secondaryTables ); - currentJoinColumn.setMappings( mappings ); - currentJoinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) ); - currentJoinColumn.setMappedBy( mappedBy ); - currentJoinColumn.setJoinAnnotation( annJoin, propertyName ); - currentJoinColumn.setNullable( false ); //I break the spec, but it's for good - //done after the annotation to override it - currentJoinColumn.bind(); - joinColumns[index] = currentJoinColumn; - } - } - return joinColumns; - } - private static void bindComponent( PropertyData inferredData, PropertyHolder propertyHolder, Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -197,9 +197,8 @@ hbmEntities = new HashMap<String, Document>(); annotatedClassEntities = new HashMap<String, XClass>(); hbmDocuments = new ArrayList<Document>(); - //bindingColumnNamePerTable = new HashMap<Table, ExtendedMappings.ColumnNames>(); namingStrategy = EJB3NamingStrategy.INSTANCE; - //bindingTableNames = new HashMap<String, ExtendedMappings.TableDescription>(); + setEntityResolver( EJB3DTDEntityResolver.INSTANCE ); } @Override Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -58,11 +58,14 @@ this.mappedBy = mappedBy; } - public Ejb3JoinColumn() { + //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public + private Ejb3JoinColumn() { setMappedBy( AnnotationBinder.ANNOTATION_STRING_DEFAULT ); } - public Ejb3JoinColumn( + //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public + //TODO get rid of it and use setters + private Ejb3JoinColumn( String sqlType, String name, boolean nullable, @@ -100,14 +103,54 @@ return referencedColumn; } - public static Ejb3JoinColumn buildJoinColumn( + public static Ejb3JoinColumn[] buildJoinColumns( + JoinColumn[] anns, + String mappedBy, Map<String, Join> joins, + PropertyHolder propertyHolder, + String propertyName, + ExtendedMappings mappings + ) { + JoinColumn[] actualColumns = propertyHolder.getOverriddenJoinColumn( + StringHelper.qualify( propertyHolder.getPath(), propertyName ) + ); + if ( actualColumns == null ) actualColumns = anns; + if (actualColumns == null) { + return new Ejb3JoinColumn[] { + buildJoinColumn( (JoinColumn) null, mappedBy, joins, propertyHolder, propertyName, mappings ) + }; + } + else { + int size = actualColumns.length; + Ejb3JoinColumn[] result = new Ejb3JoinColumn[ size ]; + for ( int index = 0 ; index < size ; index++ ) { + result[index] = buildJoinColumn( + actualColumns[index], + mappedBy, + joins, + propertyHolder, + propertyName, + mappings + ); + } + return result; + } + } + + /** + * build join column for SecondaryTables + */ + private static Ejb3JoinColumn buildJoinColumn( JoinColumn ann, - Map<String, Join> joins, + String mappedBy, Map<String, Join> joins, PropertyHolder propertyHolder, String propertyName, ExtendedMappings mappings ) { if ( ann != null ) { + if ( AnnotationBinder.isDefault( mappedBy ) ) { + throw new AnnotationException("Illegal attempt to define a @JoinColumn with a mappedBy association: " + + BinderHelper.getRelativePath( propertyHolder, propertyName ) ); + } Ejb3JoinColumn joinColumn = new Ejb3JoinColumn(); joinColumn.setJoinAnnotation( ann, null ); joinColumn.setJoins( joins ); @@ -120,6 +163,7 @@ } else { Ejb3JoinColumn joinColumn = new Ejb3JoinColumn(); + joinColumn.setMappedBy( mappedBy ); joinColumn.setJoins( joins ); joinColumn.setPropertyHolder( propertyHolder ); joinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) ); @@ -127,7 +171,6 @@ joinColumn.setMappings( mappings ); joinColumn.bind(); return joinColumn; - //return buildImplicitJoinColumn( AnnotationBinder.ANNOTATION_STRING_DEFAULT, joins, propertyHolder, propertyName, mappings); } } @@ -150,62 +193,10 @@ } } - public static Ejb3JoinColumn buildImplicitJoinColumn( - String mappedBy, - Map<String, Join> joins, - PropertyHolder propertyHolder, - String propertyName, - ExtendedMappings mappings - ) { - return new Ejb3JoinColumn( - (String) null, null, - true, false, true, true, null, (String) null, joins, - propertyHolder, propertyName, mappedBy, true, mappings - ); - } - /** - * Build an Ejb3JoinColumn from a potential annotation and - * the identifier it refers to - * - * @param ann JoinColumn annotation - * @param identifier value explaining the identifier - * @param propertyHolder - * @param mappings mappings - * @return Ejb3JoinColumn + * Build JoinColumn for a JOINED hierarchy */ public static Ejb3JoinColumn buildJoinColumn( - JoinColumn ann, - Value identifier, - Map<String, Join> joins, - PropertyHolder propertyHolder, ExtendedMappings mappings - ) { - - Column col = (Column) identifier.getColumnIterator().next(); - String defaultName = mappings.getLogicalColumnName( col.getName(), identifier.getTable() ); - if ( ann != null ) { - String sqlType = ann.columnDefinition().equals( "" ) ? null : ann.columnDefinition(); - String name = ann.name().equals( "" ) ? defaultName : ann.name(); - return new Ejb3JoinColumn( - sqlType, - name, ann.nullable(), ann.unique(), - ann.insertable(), ann.updatable(), - ann.referencedColumnName(), - ann.table(), - joins, - propertyHolder, null, null, false, mappings - ); - } - else { - return new Ejb3JoinColumn( - (String) null, defaultName, - true, false, true, true, null, (String) null, - joins, propertyHolder, null, null, false, mappings - ); - } - } - - public static Ejb3JoinColumn buildJoinColumn( PrimaryKeyJoinColumn ann, Value identifier, Map<String, Join> joins, @@ -430,4 +421,50 @@ public void setMappedByTableName(String mappedByTableName) { this.mappedByTableName = mappedByTableName; } + + public static Ejb3JoinColumn[] buildJoinTableJoinColumns( + JoinColumn[] annJoins, Map<String, Join> secondaryTables, + PropertyHolder propertyHolder, String propertyName, String mappedBy, ExtendedMappings mappings + ) { + Ejb3JoinColumn[] joinColumns; + if ( annJoins == null ) { + Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); + currentJoinColumn.setImplicit( true ); + currentJoinColumn.setNullable( false ); //I break the spec, but it's for good + currentJoinColumn.setPropertyHolder( propertyHolder ); + currentJoinColumn.setJoins( secondaryTables ); + currentJoinColumn.setMappings( mappings ); + currentJoinColumn.setPropertyName( + BinderHelper.getRelativePath( propertyHolder, propertyName ) + ); + currentJoinColumn.setMappedBy( mappedBy ); + currentJoinColumn.bind(); + + joinColumns = new Ejb3JoinColumn[]{ + currentJoinColumn + + }; + } + else { + joinColumns = new Ejb3JoinColumn[annJoins.length]; + JoinColumn annJoin; + int length = annJoins.length; + for ( int index = 0; index < length ; index++ ) { + annJoin = annJoins[index]; + Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn(); + currentJoinColumn.setImplicit( true ); + currentJoinColumn.setPropertyHolder( propertyHolder ); + currentJoinColumn.setJoins( secondaryTables ); + currentJoinColumn.setMappings( mappings ); + currentJoinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) ); + currentJoinColumn.setMappedBy( mappedBy ); + currentJoinColumn.setJoinAnnotation( annJoin, propertyName ); + currentJoinColumn.setNullable( false ); //I break the spec, but it's for good + //done after the annotation to override it + currentJoinColumn.bind(); + joinColumns[index] = currentJoinColumn; + } + } + return joinColumns; + } } \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -1,6 +1,7 @@ package org.hibernate.cfg; import javax.persistence.Column; +import javax.persistence.JoinColumn; import org.hibernate.mapping.KeyValue; import org.hibernate.mapping.PersistentClass; @@ -32,6 +33,11 @@ */ Column[] getOverriddenColumn(String propertyName); + /** + * return null if the column is not overridden, or an array of column if true + */ + JoinColumn[] getOverriddenJoinColumn(String propertyName); + String getEntityName(); void addProperty(Property prop, Ejb3Column[] columns); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -1,24 +1,14 @@ //$Id$ package org.hibernate.cfg; -import java.util.HashMap; import java.util.Map; -import javax.persistence.AttributeOverride; -import javax.persistence.AttributeOverrides; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.MappedSuperclass; -import javax.persistence.Embeddable; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Component; -import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Join; -import org.hibernate.reflection.XAnnotatedElement; +import org.hibernate.mapping.PersistentClass; import org.hibernate.reflection.XClass; -import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XProperty; -import org.hibernate.util.StringHelper; /** * This factory is here ot build a PropertyHolder and prevent .mapping interface adding @@ -61,46 +51,4 @@ return buildPropertyHolder( null, persistentClass, joins ); } - public static Map<String, Column[]> buildHierarchyColumnOverride(XClass element, String path) { - XClass current = element; - Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); - while ( ! ReflectionManager.INSTANCE.toXClass( Object.class ).equals( current ) ) { - if ( current.isAnnotationPresent(Entity.class) || current.isAnnotationPresent(MappedSuperclass.class) - || current.isAnnotationPresent(Embeddable.class) ) { - //FIXME is embeddable override? - Map<String, Column[]> currentOverride = buildColumnOverride( current, path ); - currentOverride.putAll(columnOverride); //subclasses have precedence over superclasses - columnOverride = currentOverride; - } - current = current.getSuperclass(); - } - - return columnOverride; - } - - public static Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) { - AttributeOverride singleOverride = element.getAnnotation( AttributeOverride.class ); - AttributeOverrides multipleOverrides = element.getAnnotation( AttributeOverrides.class ); - AttributeOverride[] overrides; - if ( singleOverride != null ) { - overrides = new AttributeOverride[]{singleOverride}; - } - else if ( multipleOverrides != null ) { - overrides = multipleOverrides.value(); - } - else { - overrides = null; - } - Map<String, Column[]> columnOverride = new HashMap<String, Column[]>(); - //fill overriden columns - if ( overrides != null ) { - for ( AttributeOverride depAttr : overrides ) { - columnOverride.put( - StringHelper.qualify( path, depAttr.name() ), - new Column[]{depAttr.column()} - ); - } - } - return columnOverride; - } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -6,9 +6,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; - import javax.persistence.Entity; -import javax.persistence.JoinColumn; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.PrimaryKeyJoinColumns; import javax.persistence.SecondaryTable; @@ -355,7 +353,7 @@ if ( nbrOfJoinColumns == 0 ) { ejb3JoinColumns = new Ejb3JoinColumn[1]; ejb3JoinColumns[0] = Ejb3JoinColumn.buildJoinColumn( - (JoinColumn) null, + (PrimaryKeyJoinColumn) null, persistentClass.getIdentifier(), secondaryTables, propertyHolder, mappings Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -71,9 +71,10 @@ * 2. list all the properties following the expected one in the parent property * 3. calculate the lowest index and insert the property */ - PersistentClass pc = mappings.getClass( entity.name() ); + PersistentClass pc = mappings.getClass( entity.entityClass().getName() ); if (pc == null) - throw new MappingException( "Entity not found " + entity.name() + " in SqlResultsetMapping " + ann.name() ); + throw new MappingException( "Entity not found " + entity.entityClass().getName() + + " in SqlResultsetMapping " + ann.name() ); int dotIndex = name.lastIndexOf( '.' ); String reducedName = name.substring( 0, dotIndex ); Iterator parentPropIter = getSubPropertyIterator( pc, reducedName ); @@ -107,7 +108,7 @@ if ( uniqueReturnProperty.contains( name ) ) { throw new MappingException( "duplicate @FieldResult for property " + name + - " on @Entity " + entity.name() + " in " + ann.name() + " on @Entity " + entity.entityClass().getName() + " in " + ann.name() ); } uniqueReturnProperty.add(name); @@ -135,7 +136,7 @@ propertyresults = propertyresults.isEmpty() ? CollectionHelper.EMPTY_MAP : propertyresults; SQLQueryRootReturn result = - new SQLQueryRootReturn( "alias" + entityAliasIndex++, entity.name(), propertyresults, LockMode.READ ); + new SQLQueryRootReturn( "alias" + entityAliasIndex++, entity.entityClass().getName(), propertyresults, LockMode.READ ); definition.addEntityQueryReturn( result ); } Copied: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java (from rev 9528, trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java) =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java 2006-03-01 04:24:08 UTC (rev 9528) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,103 @@ +package org.hibernate.reflection.java; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; + +import javax.persistence.Entity; +import javax.persistence.MappedSuperclass; +import javax.persistence.Embeddable; + +import org.dom4j.Element; +import org.hibernate.annotationfactory.AnnotationDescriptor; +import org.hibernate.annotationfactory.AnnotationFactory; +import org.hibernate.reflection.java.xml.XMLContext; + +/** + * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. + * + * @author Paolo Perrotta + * @author Davide Marchignoli + */ +class EJB3ClassAnnotationReader extends JavaAnnotationReader { + private XMLContext xmlContext; + private String className; + private static final Map<Class, String> annotationToXml; + + static { + annotationToXml = new HashMap<Class, String>(); + annotationToXml.put(Entity.class, "entity"); + annotationToXml.put(MappedSuperclass.class, "mapped-superclass"); + annotationToXml.put(Embeddable.class, "embeddable"); + } + + public EJB3ClassAnnotationReader( AnnotatedElement el, XMLContext xmlContext ) { + super( el ); + this.xmlContext = xmlContext; + if (el instanceof Class) { + Class clazz = (Class) el; + className = clazz.getName(); + } + } + + public <T extends Annotation> T getAnnotation(Class<T> annotationType) { + + return super.getAnnotation( annotationType ); + } + + public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { + return super.isAnnotationPresent( annotationType ); + } + + public Annotation[] getAnnotations() { + XMLContext.Default defaults = xmlContext.getDefault(className); + Element tree = xmlContext.getXMLTree( className, null); + Annotation[] annotations = super.getAnnotations(); + List<Annotation> annotationList = new ArrayList<Annotation>(annotations.length + 5); + for (Annotation annotation : annotations) { + if (! annotationToXml.containsKey( annotation ) ) { + //unknown annotations are left over + annotationList.add(annotation); + } + } + Annotation current = getEntity(tree, defaults); + if (current != null) annotationList.add(current); + return super.getAnnotations(); + } + + private Entity getEntity(Element tree, XMLContext.Default defaults) { + if (tree == null) { + return Boolean.TRUE.equals( defaults.getMetadataComplete() ) ? super.getAnnotation( Entity.class ) : null; + } + else { + if ( "entity".equals( tree.getName() ) ) { + AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class ); + entity.setValue( "name", tree.attributeValue( "name", "" ) ); + return AnnotationFactory.create( entity ); + } + else { + return null; //this is not an entity + } + } + } + + private Annotation getTopLevelElement(Class<Annotation> annotation, Element tree, XMLContext.Default defaults) { + if (tree == null) { + return getAnnotation( annotation ); + } + else { + if ( tree.getName().equals( annotationToXml.get( annotation ) ) ) { + //TODO resume *********************************** + return null; + } + else { + return null; //this is not an entity + } + } + } + + +} Property changes on: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3ClassAnnotationReader.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaAnnotationReader.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -11,7 +11,7 @@ */ class JavaAnnotationReader { - private final AnnotatedElement element; + protected final AnnotatedElement element; public JavaAnnotationReader( AnnotatedElement el ) { this.element = el; Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXAnnotatedElement.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -4,9 +4,8 @@ import java.lang.reflect.AnnotatedElement; import org.hibernate.reflection.XAnnotatedElement; +import org.hibernate.reflection.java.xml.XMLContext; -import org.dom4j.Document; - /** * @author Paolo Perrotta * @author Davide Marchignoli @@ -15,6 +14,7 @@ // responsible for extracting annotations private JavaAnnotationReader annotationReader; + private final XMLContext xmlContext; private final JavaXFactory factory; @@ -24,6 +24,7 @@ this.annotationReader = new JavaAnnotationReader( annotatedElement ); this.factory = factory; this.annotatedElement = annotatedElement; + this.xmlContext = factory.getXMLContext(); } protected JavaXFactory getFactory() { @@ -34,12 +35,6 @@ return annotationReader; } - public void setXMLDescriptor(Document xml) { - if ( xml == null ) - return; - annotationReader = new XMLAnnotationReader( this.toAnnotatedElement(), xml ); - } - public <T extends Annotation> T getAnnotation(Class<T> annotationType) { return getAnnotationReader().getAnnotation( annotationType ); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -9,7 +9,8 @@ import java.util.HashMap; import java.util.Map; -import org.dom4j.Document; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.hibernate.reflection.ReflectionManager; import org.hibernate.reflection.XClass; import org.hibernate.reflection.XMethod; @@ -20,7 +21,10 @@ import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; import org.hibernate.reflection.java.generics.TypeSwitch; import org.hibernate.reflection.java.generics.TypeUtils; +import org.hibernate.reflection.java.xml.XMLContext; import org.hibernate.util.ReflectHelper; +import org.hibernate.util.XMLHelper; +import org.xml.sax.EntityResolver; /** * The factory for all the objects in this package. @@ -30,6 +34,11 @@ */ public class JavaXFactory implements ReflectionManager { + private static Log log = LogFactory.getLog( JavaXFactory.class ); + private transient XMLHelper xmlHelper; + private EntityResolver entityResolver; + private XMLContext xmlContext; + private static class PropertyKey extends Pair<Member, XClass> { PropertyKey(Member member, XClass owner) { super( member, owner ); @@ -51,14 +60,14 @@ private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory(); - private final Document xml; - public JavaXFactory() { - this.xml = null; + reset(); } - public JavaXFactory(Document xmlDescriptor) { - this.xml = xmlDescriptor; + private void reset() { + xmlHelper = new XMLHelper(); + entityResolver = XMLHelper.DEFAULT_DTD_RESOLVER; + xmlContext = new XMLContext(); } public XClass toXClass(Class clazz) { @@ -88,7 +97,8 @@ JavaXClass result = xClasses.get( key ); if ( result == null ) { result = new JavaXClass( classType, context, JavaXFactory.this ); - result.setXMLDescriptor( xml ); + //TODO get rid of it + //result.setXMLDescriptor( xml ); xClasses.put( key, result ); } return result; @@ -105,7 +115,8 @@ JavaXPackage xPackage = packagesToXPackages.get( pkg ); if ( xPackage == null ) { xPackage = new JavaXPackage( pkg, this ); - xPackage.setXMLDescriptor( xml ); + //TODO get rid of it + //xPackage.setXMLDescriptor( xml ); packagesToXPackages.put( pkg, xPackage ); } return xPackage; @@ -302,4 +313,8 @@ } return ( (JavaXClass) class1 ).toClass().equals( class2 ); } + + XMLContext getXMLContext() { + return xmlContext; + } } Deleted: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/XMLAnnotationReader.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -1,36 +0,0 @@ -package org.hibernate.reflection.java; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; - -import org.dom4j.Document; - -/** - * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor. - * - * @author Paolo Perrotta - * @author Davide Marchignoli - */ -class XMLAnnotationReader extends JavaAnnotationReader { - - public XMLAnnotationReader( AnnotatedElement el, Document xmlDescriptor ) { - super( el ); - // TODO: it just ignores the XML for now. write the overrides - // - // This class is supposed to use the facilities in package - // annotationfactory to actually instance annotations (maybe we should - // move the whole package here?) - } - - public <T extends Annotation> T getAnnotation(Class<T> annotationType) { - return super.getAnnotation( annotationType ); - } - - public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) { - return super.isAnnotationPresent( annotationType ); - } - - public Annotation[] getAnnotations() { - return super.getAnnotations(); - } -} Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,183 @@ +//$Id: $ +package org.hibernate.reflection.java.xml; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.hibernate.util.StringHelper; + +/** + * @author Emmanuel Bernard + */ +public class XMLContext { + private static Log log = LogFactory.getLog( XMLContext.class ); + private Default globalDefaults; + private Map<String,Element> classOverriding = new HashMap<String, Element>(); + private Map<String,Default> defaultsOverriding = new HashMap<String, Default>(); + + public void addDocument(Document doc) { + Element root = doc.getRootElement(); + + //global defaults + Element metadata = root.element( "persistence-unit-metadata" ); + if (metadata != null) { + if (globalDefaults == null) { + globalDefaults = new Default(); + globalDefaults.setMetadataComplete( + metadata.element( "xml-mapping-metadata-complete" ) != null ? + Boolean.TRUE : + null + ); + Element defaultElement = metadata.element( "persistence-unit-defaults" ); + Element unitElement = defaultElement.element( "schema" ); + globalDefaults.setSchema( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "catalog" ); + globalDefaults.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "access" ); + globalDefaults.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = defaultElement.element( "cascade-persist" ); + globalDefaults.setCascadePersist( unitElement != null ? Boolean.TRUE : null ); + //TODO entity listeners + } + else { + log.warn("Found more than one <persistence-unit-metadata>, ignored"); + } + } + + //entity mapping default + Default entityMappingDefault = new Default(); + Element unitElement = root.element("package"); + String packageName = unitElement != null ? unitElement.getTextTrim() : ""; + entityMappingDefault.setPackageName( packageName ); + unitElement = root.element("schema"); + entityMappingDefault.setSchema( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = root.element("catalog"); + entityMappingDefault.setCatalog( unitElement != null ? unitElement.getTextTrim() : null ); + unitElement = root.element("access"); + entityMappingDefault.setAccess( unitElement != null ? unitElement.getTextTrim() : null ); + + + List<Element> entities = (List<Element>) root.elements( "entity" ); + addClass( entities, packageName, entityMappingDefault ); + + entities = (List<Element>) root.elements( "mapped-superclass" ); + addClass( entities, packageName, entityMappingDefault ); + + entities = (List<Element>) root.elements( "embeddable" ); + addClass( entities, packageName, entityMappingDefault ); + } + + private void addClass(List<Element> entities, String packageName, Default defaults) { + for (Element element : entities) { + Attribute attribute = element.attribute( "class" ); + String className = buildSafeClassName( attribute.getText(), packageName ); + if ( classOverriding.containsKey( className ) ) { + //maybe switch it to warn? + throw new IllegalStateException( "Duplicate XML entry for " + className); + } + classOverriding.put( className, element ); + Default localDefault = new Default(); + localDefault.override( defaults ); + attribute = element.attribute( "metadata-complete" ); + if (attribute != null) localDefault.setMetadataComplete( (Boolean) attribute.getData() ); + defaultsOverriding.put( className, localDefault ); + + log.debug( "Adding XML overriding information for " + className); + } + } + + private static String buildSafeClassName(String className, String defaultPackageName) { + if ( className.indexOf( '.' ) < 0 && defaultPackageName != null) { + className = StringHelper.qualify(defaultPackageName, className); + } + return className; + } + + public Default getDefault(String className) { + Default xmlDefault = new Default(); + xmlDefault.override( globalDefaults ); + Default entityMappingOverriding = defaultsOverriding.get( className ); + xmlDefault.override( entityMappingOverriding ); + return xmlDefault; + } + + public Element getXMLTree(String className, String methodName) { + return classOverriding.get(className); + } + + public static class Default { + private String access; + private String packageName; + private String schema; + private String catalog; + private Boolean metadataComplete; + private Boolean cascadePersist; + + public String getAccess() { + return access; + } + + protected void setAccess(String access) { + this.access = access; + } + + public String getCatalog() { + return catalog; + } + + protected void setCatalog(String catalog) { + this.catalog = catalog; + } + + public String getPackageName() { + return packageName; + } + + protected void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getSchema() { + return schema; + } + + protected void setSchema(String schema) { + this.schema = schema; + } + + public Boolean getMetadataComplete() { + return metadataComplete; + } + + protected void setMetadataComplete(Boolean metadataComplete) { + this.metadataComplete = metadataComplete; + } + + public Boolean getCascadePersist() { + return cascadePersist; + } + + void setCascadePersist(Boolean cascadePersist) { + this.cascadePersist = cascadePersist; + } + + public void override(Default globalDefault) { + if (globalDefault != null) { + if ( globalDefault.getAccess() != null) access = globalDefault.getAccess(); + if ( globalDefault.getPackageName() != null) packageName = globalDefault.getPackageName(); + if ( globalDefault.getSchema() != null) schema = globalDefault.getSchema(); + if ( globalDefault.getCatalog() != null) catalog = globalDefault.getCatalog(); + if ( globalDefault.getMetadataComplete() != null) metadataComplete = globalDefault.getMetadataComplete(); + //TODO fix that in stone if cascade-persist is set already? + if ( globalDefault.getCascadePersist() != null) cascadePersist = globalDefault.getCascadePersist(); + } + } + + } +} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/join/Death.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -8,7 +8,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.JoinColumn; +import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.SecondaryTable; /** @@ -18,7 +18,7 @@ @SecondaryTable( name="ExtendedDeath" ) -@JoinColumn(name="DEATH_ID") +@PrimaryKeyJoinColumn(name="DEATH_ID") public class Death implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer id; Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,47 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import org.hibernate.test.annotations.TestCase; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.HibernateException; + +/** + * @author Emmanuel Bernard + */ +public class AssociationOverrideTest extends TestCase { + + public void testOverriding() throws Exception { + Location paris = new Location(); + paris.setName( "Paris" ); + Location atlanta = new Location(); + atlanta.setName( "Atlanta" ); + Trip trip = new Trip(); + trip.setFrom( paris ); + //trip.setTo( atlanta ); + Session s = openSession(); + Transaction tx = s.beginTransaction(); + s.persist( paris ); + s.persist( atlanta ); + try { + s.persist( trip ); + s.flush(); + fail("Should be non nullable"); + } + catch( HibernateException e ) { + //success + } + finally { + tx.rollback(); + s.close(); + } + } + + protected Class[] getMappings() { + return new Class[] { + Location.class, + Move.class, + Trip.class + }; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Location.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,21 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * @author Emmanuel Bernard + */ +@Entity +public class Location { + private String name; + + @Id public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Move.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,46 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import javax.persistence.MappedSuperclass; +import javax.persistence.ManyToOne; +import javax.persistence.Id; +import javax.persistence.GeneratedValue; +import javax.persistence.JoinColumn; + +/** + * @author Emmanuel Bernard + */ +@MappedSuperclass +public class Move { + private int id; + private Location from; + private Location to; + + @ManyToOne + public Location getFrom() { + return from; + } + + public void setFrom(Location from) { + this.from = from; + } + + @Id @GeneratedValue + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @ManyToOne + @JoinColumn(name="to", nullable = true) + public Location getTo() { + return to; + } + + public void setTo(Location to) { + this.to = to; + } +} Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/override/Trip.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -0,0 +1,17 @@ +//$Id: $ +package org.hibernate.test.annotations.override; + +import javax.persistence.Entity; +import javax.persistence.AssociationOverrides; +import javax.persistence.AssociationOverride; +import javax.persistence.JoinColumn; + +/** + * @author Emmanuel Bernard + */ +@Entity +@AssociationOverrides( { + @AssociationOverride( name="from", joinColumns = @JoinColumn(name="from", nullable = false) ), + @AssociationOverride( name="to", joinColumns = @JoinColumn(name="to", nullable = false) ) +} ) +public class Trip extends Move {} Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Area.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -11,6 +11,7 @@ import javax.persistence.SqlResultSetMapping; import javax.persistence.Table; import javax.persistence.GeneratedValue; +import javax.persistence.SqlResultSetMappings; /** * Example of a entity load incl a join fetching of an associated *ToOne entity @@ -29,18 +30,20 @@ + "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id", resultSetMapping="joinMapping") } ) -@SqlResultSetMapping(name="joinMapping", entities={ - @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = { - @FieldResult(name="id", column="nid"), - @FieldResult(name="duration", column="night_duration"), - @FieldResult(name="date", column="night_date"), - @FieldResult(name="area", column="area_id") - }), - @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = { - @FieldResult(name="id", column="aid"), - @FieldResult(name="name", column="name") - }) - } +@SqlResultSetMappings( + @SqlResultSetMapping(name="joinMapping", entities={ + @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = { + @FieldResult(name="id", column="nid"), + @FieldResult(name="duration", column="night_duration"), + @FieldResult(name="date", column="night_date"), + @FieldResult(name="area", column="area_id") + }), + @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = { + @FieldResult(name="id", column="aid"), + @FieldResult(name="name", column="name") + }) + } + ) ) @Table(name="tbl_area") public class Area { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Captain.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ @Entity @IdClass(Identity.class) @SqlResultSetMapping(name="compositekey", - entities=@EntityResult(name="org.hibernate.test.annotations.query.SpaceShip", + entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class, fields = { @FieldResult(name="name", column = "name"), @FieldResult(name="model", column = "model"), Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/Dictionary.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -20,7 +20,7 @@ @SqlResultSetMapping( name="dictionary", entities = { @EntityResult( - name="org.hibernate.test.annotations.query.Dictionary", + entityClass=org.hibernate.test.annotations.query.Dictionary.class, fields = { @FieldResult(name="id", column="id"), @FieldResult(name="name", column="name"), Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ * @author Emmanuel Bernard */ @Entity -@SqlResultSetMapping(name="implicit", entities=@EntityResult(name="org.hibernate.test.annotations.query.SpaceShip")) +@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class)) @NamedNativeQueries( { @NamedNativeQuery(name="implicitSample", query ="select * from SpaceShip", resultSetMapping="implicit"), @NamedNativeQuery(name="compositekey", Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/query/package-info.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ name="sqlmapping", entities = { @EntityResult( - name="org.hibernate.test.annotations.query.Night", + entityClass=org.hibernate.test.annotations.query.Night.class, fields = { @FieldResult(name="id", column = "id"), @FieldResult(name="duration", column = "night_duration"), Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -16,7 +16,7 @@ /** * @author Paolo Perrotta */ -public class JavaXClassTest extends XAnnotatedElementTest { +public class JavaXClassTest extends XAnnotatedElementTestCase { XClass clazz; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-06 18:46:41 UTC (rev 9559) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-07 11:36:38 UTC (rev 9560) @@ -17,7 +17,7 @@ /** * @author Paolo Perrotta */ -public class JavaXPropertyTest extends XAnnotatedElementTest { +public class JavaXPropertyTest extends XAnnotatedElementTestCase { private ReflectionManager factory = new JavaXFactory(); Deleted: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/XAnnotatedElement... [truncated message content] |
From: <hib...@li...> - 2006-03-06 18:46:48
|
Author: ste...@jb... Date: 2006-03-06 13:46:41 -0500 (Mon, 06 Mar 2006) New Revision: 9559 Added: trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java Log: test for HHH-1543 Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml 2006-03-06 18:45:51 UTC (rev 9558) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/Item.hbm.xml 2006-03-06 18:46:41 UTC (rev 9559) @@ -12,6 +12,17 @@ </id> <property name="name" not-null="true"/> <property name="description" not-null="true"/> - </class> + <set name="parts" inverse="false" cascade="save-update" table="ITEM_PARTS" fetch="select"> + <key column="ITEM_ID"/> + <many-to-many class="Part" column="PART_ID"/> + </set> + </class> + <class name="Part" table="Parts"> + <id name="id"> + <generator class="native"/> + </id> + <property name="name"/> + </class> + </hibernate-mapping> Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java 2006-03-06 18:45:51 UTC (rev 9558) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/Item.java 2006-03-06 18:46:41 UTC (rev 9559) @@ -1,7 +1,10 @@ //$Id$ package org.hibernate.test.querycache; +import java.util.Set; +import java.util.HashSet; + /** * @author Gavin King */ @@ -9,7 +12,8 @@ private long id; private String name; private String description; - + private Set parts = new HashSet(); + public String getDescription() { return description; } @@ -28,4 +32,12 @@ public void setName(String name) { this.name = name; } + + public Set getParts() { + return parts; + } + + public void setParts(Set parts) { + this.parts = parts; + } } Added: trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java 2006-03-06 18:45:51 UTC (rev 9558) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/Part.java 2006-03-06 18:46:41 UTC (rev 9559) @@ -0,0 +1,25 @@ +package org.hibernate.test.querycache; + +/** + * @author Steve Ebersole + */ +public class Part { + private Long id; + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} |
From: <hib...@li...> - 2006-03-06 18:46:00
|
Author: ste...@jb... Date: 2006-03-06 13:45:51 -0500 (Mon, 06 Mar 2006) New Revision: 9558 Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java Log: test for HHH-1543 Modified: trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java 2006-03-06 15:16:27 UTC (rev 9557) +++ trunk/Hibernate3/test/org/hibernate/test/querycache/QueryCacheTest.java 2006-03-06 18:45:51 UTC (rev 9558) @@ -13,6 +13,7 @@ import org.hibernate.cfg.Environment; import org.hibernate.stat.EntityStatistics; import org.hibernate.stat.QueryStatistics; +import org.hibernate.stat.CollectionStatistics; import org.hibernate.test.TestCase; /** @@ -233,7 +234,77 @@ } + public void testCollectionFetchCachingFailureExpected() throws Throwable { + getSessions().evictQueries(); + getSessions().getStatistics().clear(); + final String queryString = "select distinct i from Item i join fetch i.parts"; + + Session s = openSession(); + Transaction t = s.beginTransaction(); + Item i = new Item(); + i.setName( "widget" ); + i.setDescription( "A really top-quality, full-featured widget." ); + Part p1 = new Part(); + p1.setName( "p1-1" ); + i.getParts().add( p1 ); + Part p2 = new Part(); + p2.setName( "part-2" ); + i.getParts().add( p2 ); + s.save( i ); + t.commit(); + s.close(); + + getSessions().evict( Item.class ); + + QueryStatistics qs = getSessions().getStatistics().getQueryStatistics( queryString ); + EntityStatistics es = getSessions().getStatistics().getEntityStatistics( Item.class.getName() ); + CollectionStatistics cs = getSessions().getStatistics().getCollectionStatistics( Item.class.getName() + ".parts" ); + + Thread.sleep(200); + + s = openSession(); + t = s.beginTransaction(); + List result = s.createQuery( queryString ).setCacheable( true ).list(); + assertEquals( result.size(), 1 ); + i = ( Item ) result.get( 0 ); + assertTrue( Hibernate.isInitialized( i ) ); + assertTrue( Hibernate.isInitialized( i.getParts() ) ); + t.commit(); + s.close(); + + assertEquals( qs.getCacheHitCount(), 0 ); + assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 ); + assertEquals( getSessions().getStatistics().getCollectionFetchCount(), 0 ); + + s = openSession(); + t = s.beginTransaction(); + result = s.createQuery( queryString ).setCacheable( true ).list(); + assertEquals( result.size(), 1 ); + i = ( Item ) result.get( 0 ); + assertTrue( Hibernate.isInitialized( i ) ); + // todo : this is the bug causing the failure expected (HHH-1543). + // when the query results are served from the query cache, + // collections are not forced to initialize + assertTrue( Hibernate.isInitialized( i.getParts() ) ); + t.commit(); + s.close(); + + assertEquals( qs.getCacheHitCount(), 1 ); + assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 ); + assertEquals( getSessions().getStatistics().getCollectionFetchCount(), 0 ); + assertEquals( es.getFetchCount(), 0 ); + assertEquals( cs.getFetchCount(), 0 ); + + s = openSession(); + t = s.beginTransaction(); + s.delete( i ); + s.flush(); + s.createQuery("delete Part").executeUpdate(); + t.commit(); + s.close(); + } + protected String[] getMappings() { return new String[] { "querycache/Item.hbm.xml" }; } |