Hibernate SVN: r18760 - core/trunk/core/src/main/java/org/hibernate/loader.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-02-10 02:05:33 -0500 (Wed, 10 Feb 2010)
New Revision: 18760
Modified:
core/trunk/core/src/main/java/org/hibernate/loader/Loader.java
Log:
HHH-4898 : Results from read-only Criteria and Query obtained from query cache are not read-only
Modified: core/trunk/core/src/main/java/org/hibernate/loader/Loader.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/Loader.java 2010-02-10 07:03:48 UTC (rev 18759)
+++ core/trunk/core/src/main/java/org/hibernate/loader/Loader.java 2010-02-10 07:05:33 UTC (rev 18760)
@@ -2170,14 +2170,14 @@
session
);
- List result = getResultFromQueryCache(
+ List result = getResultFromQueryCache(
session,
queryParameters,
querySpaces,
resultTypes,
queryCache,
key
- );
+ );
if ( result == null ) {
result = doList( session, queryParameters );
@@ -2207,7 +2207,26 @@
if ( session.getCacheMode().isGetEnabled() ) {
boolean isImmutableNaturalKeyLookup = queryParameters.isNaturalKeyLookup()
&& getEntityPersisters()[0].getEntityMetamodel().hasImmutableNaturalId();
- result = queryCache.get( key, resultTypes, isImmutableNaturalKeyLookup, querySpaces, session );
+
+ final PersistenceContext persistenceContext = session.getPersistenceContext();
+ boolean defaultReadOnlyOrig = persistenceContext.isDefaultReadOnly();
+ if ( queryParameters.isReadOnlyInitialized() ) {
+ // The read-only/modifiable mode for the query was explicitly set.
+ // Temporarily set the default read-only/modifiable setting to the query's setting.
+ persistenceContext.setDefaultReadOnly( queryParameters.isReadOnly() );
+ }
+ else {
+ // The read-only/modifiable setting for the query was not initialized.
+ // Use the default read-only/modifiable from the persistence context instead.
+ queryParameters.setReadOnly( persistenceContext.isDefaultReadOnly() );
+ }
+ try {
+ result = queryCache.get( key, resultTypes, isImmutableNaturalKeyLookup, querySpaces, session );
+ }
+ finally {
+ persistenceContext.setDefaultReadOnly( defaultReadOnlyOrig );
+ }
+
if ( factory.getStatistics().isStatisticsEnabled() ) {
if ( result == null ) {
factory.getStatisticsImplementor()
16 years, 2 months
Hibernate SVN: r18759 - core/trunk/core/src/main/java/org/hibernate/event/def.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-02-10 02:03:48 -0500 (Wed, 10 Feb 2010)
New Revision: 18759
Modified:
core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java
Log:
HHH-4896 : Read-only proxy targets initialized from second-level cache are not read-only
Modified: core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java 2010-02-10 07:00:59 UTC (rev 18758)
+++ core/trunk/core/src/main/java/org/hibernate/event/def/DefaultLoadEventListener.java 2010-02-10 07:03:48 UTC (rev 18759)
@@ -635,8 +635,9 @@
session.instantiate( subclassPersister, id ) : optionalObject;
// make it circular-reference safe
+ EntityKey entityKey = new EntityKey( id, subclassPersister, session.getEntityMode() );
TwoPhaseLoad.addUninitializedCachedEntity(
- new EntityKey( id, subclassPersister, session.getEntityMode() ),
+ entityKey,
result,
subclassPersister,
LockMode.NONE,
@@ -659,12 +660,21 @@
if ( log.isTraceEnabled() ) log.trace( "Cached Version: " + version );
final PersistenceContext persistenceContext = session.getPersistenceContext();
+ boolean isReadOnly = session.isDefaultReadOnly();
+ if ( persister.isMutable() ) {
+ Object proxy = persistenceContext.getProxy( entityKey );
+ if ( proxy != null ) {
+ // there is already a proxy for this impl
+ // only set the status to read-only if the proxy is read-only
+ isReadOnly = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer().isReadOnly();
+ }
+ }
+ else {
+ isReadOnly = true;
+ }
persistenceContext.addEntry(
result,
- ( session.isDefaultReadOnly() || ! persister.isMutable() ?
- Status.READ_ONLY :
- Status.MANAGED
- ),
+ ( isReadOnly ? Status.READ_ONLY : Status.MANAGED ),
values,
null,
id,
16 years, 2 months
Hibernate SVN: r18758 - in core/trunk: core/src/main/java/org/hibernate/engine and 4 other directories.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-02-10 02:00:59 -0500 (Wed, 10 Feb 2010)
New Revision: 18758
Added:
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Course.java
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.hbm.xml
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.java
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/ReadOnlyCriteriaQueryTest.java
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Student.java
core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/StudentDTO.java
Modified:
core/trunk/core/src/main/java/org/hibernate/Criteria.java
core/trunk/core/src/main/java/org/hibernate/Query.java
core/trunk/core/src/main/java/org/hibernate/engine/QueryParameters.java
core/trunk/core/src/main/java/org/hibernate/impl/CriteriaImpl.java
core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java
Log:
HHH-4578 : Criteria is missing read-only flag
Modified: core/trunk/core/src/main/java/org/hibernate/Criteria.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/Criteria.java 2010-02-10 04:14:39 UTC (rev 18757)
+++ core/trunk/core/src/main/java/org/hibernate/Criteria.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -313,8 +313,62 @@
* @return this (for method chaining)
*/
public Criteria setFirstResult(int firstResult);
-
+
/**
+ * Was the read-only/modifiable mode explicitly initialized?
+ *
+ * @return true, the read-only/modifiable mode was explicitly initialized; false, otherwise.
+ *
+ * @see Criteria#setReadOnly(boolean)
+ */
+ public boolean isReadOnlyInitialized();
+
+ /**
+ * Should entities and proxies loaded by this Criteria be put in read-only mode? If the
+ * read-only/modifiable setting was not initialized, then the default
+ * read-only/modifiable setting for the persistence context is returned instead.
+ * @see Criteria#setReadOnly(boolean)
+ * @see org.hibernate.engine.PersistenceContext#isDefaultReadOnly()
+ *
+ * The read-only/modifiable setting has no impact on entities/proxies returned by the
+ * Criteria that existed in the session before the Criteria was executed.
+ *
+ * @return true, entities and proxies loaded by the criteria will be put in read-only mode
+ * false, entities and proxies loaded by the criteria will be put in modifiable mode
+ * @throws IllegalStateException if <code>isReadOnlyInitialized()</code> returns <code>false</code>
+ * and this Criteria is not associated with a session.
+ * @see Criteria#isReadOnlyInitialized()
+ */
+ public boolean isReadOnly();
+
+ /**
+ * Set the read-only/modifiable mode for entities and proxies
+ * loaded by this Criteria. This setting overrides the default setting
+ * for the persistence context.
+ * @see org.hibernate.engine.PersistenceContext#isDefaultReadOnly()
+ *
+ * To set the default read-only/modifiable setting used for
+ * entities and proxies that are loaded into the session:
+ * @see org.hibernate.engine.PersistenceContext#setDefaultReadOnly(boolean)
+ * @see org.hibernate.Session#setDefaultReadOnly(boolean)
+ *
+ * Read-only entities are not dirty-checked and snapshots of persistent
+ * state are not maintained. Read-only entities can be modified, but
+ * changes are not persisted.
+ *
+ * When a proxy is initialized, the loaded entity will have the same
+ * read-only/modifiable setting as the uninitialized
+ * proxy has, regardless of the session's current setting.
+ *
+ * The read-only/modifiable setting has no impact on entities/proxies
+ * returned by the criteria that existed in the session before the criteria was executed.
+ *
+ * @param readOnly true, entities and proxies loaded by the criteria will be put in read-only mode
+ * false, entities and proxies loaded by the criteria will be put in modifiable mode
+ */
+ public Criteria setReadOnly(boolean readOnly);
+
+ /**
* Set a fetch size for the underlying JDBC query.
*
* @param fetchSize the fetch size
Modified: core/trunk/core/src/main/java/org/hibernate/Query.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/Query.java 2010-02-10 04:14:39 UTC (rev 18757)
+++ core/trunk/core/src/main/java/org/hibernate/Query.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -211,10 +211,9 @@
* The read-only/modifiable setting has no impact on entities/proxies
* returned by the query that existed in the session before the query was executed.
*
- * @return true, entities and proxies loaded by the query will be put in read-only mode
- * false, entities and proxies loaded by the query will be put in modifiable mode
+ * @param readOnly true, entities and proxies loaded by the query will be put in read-only mode
+ * false, entities and proxies loaded by the query will be put in modifiable mode
*/
-
public Query setReadOnly(boolean readOnly);
/**
Modified: core/trunk/core/src/main/java/org/hibernate/engine/QueryParameters.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/engine/QueryParameters.java 2010-02-10 04:14:39 UTC (rev 18757)
+++ core/trunk/core/src/main/java/org/hibernate/engine/QueryParameters.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -102,7 +102,7 @@
public QueryParameters(
final Type[] positionalParameterTypes,
final Object[] postionalParameterValues) {
- this( positionalParameterTypes, postionalParameterValues, null, null, false, null, null, false, null );
+ this( positionalParameterTypes, postionalParameterValues, null, null, false, false, false, null, null, false, null );
}
public QueryParameters(
@@ -138,6 +138,8 @@
final Object[] positionalParameterValues,
final LockOptions lockOptions,
final RowSelection rowSelection,
+ final boolean isReadOnlyInitialized,
+ final boolean readOnly,
final boolean cacheable,
final String cacheRegion,
//final boolean forceCacheRefresh,
@@ -150,8 +152,8 @@
null,
lockOptions,
rowSelection,
- false,
- false,
+ isReadOnlyInitialized,
+ readOnly,
cacheable,
cacheRegion,
comment,
Modified: core/trunk/core/src/main/java/org/hibernate/impl/CriteriaImpl.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/impl/CriteriaImpl.java 2010-02-10 04:14:39 UTC (rev 18757)
+++ core/trunk/core/src/main/java/org/hibernate/impl/CriteriaImpl.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -81,6 +81,8 @@
private FlushMode sessionFlushMode;
private CacheMode sessionCacheMode;
+ private Boolean readOnly;
+
private ResultTransformer resultTransformer = Criteria.ROOT_ENTITY;
@@ -272,6 +274,36 @@
return this;
}
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isReadOnlyInitialized() {
+ return readOnly != null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isReadOnly() {
+ if ( ! isReadOnlyInitialized() && getSession() == null ) {
+ throw new IllegalStateException(
+ "cannot determine readOnly/modifiable setting when it is not initialized and is not initialized and getSession() == null"
+ );
+ }
+ return ( isReadOnlyInitialized() ?
+ readOnly.booleanValue() :
+ getSession().getPersistenceContext().isDefaultReadOnly()
+ );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Criteria setReadOnly(boolean readOnly) {
+ this.readOnly = Boolean.valueOf( readOnly );
+ return this;
+ }
+
public boolean getCacheable() {
return this.cacheable;
}
@@ -494,6 +526,19 @@
return new Subcriteria( this, associationPath, alias, joinType, withClause );
}
+ public boolean isReadOnly() {
+ return CriteriaImpl.this.isReadOnly();
+ }
+
+ public boolean isReadOnlyInitialized() {
+ return CriteriaImpl.this.isReadOnlyInitialized();
+ }
+
+ public Criteria setReadOnly(boolean readOnly) {
+ CriteriaImpl.this.setReadOnly( readOnly );
+ return this;
+ }
+
public Criteria setCacheable(boolean cacheable) {
CriteriaImpl.this.setCacheable(cacheable);
return this;
Modified: core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java 2010-02-10 04:14:39 UTC (rev 18757)
+++ core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -325,6 +325,8 @@
valueArray,
lockOptions,
selection,
+ rootCriteria.isReadOnlyInitialized(),
+ ( rootCriteria.isReadOnlyInitialized() ? rootCriteria.isReadOnly() : false ),
rootCriteria.getCacheable(),
rootCriteria.getCacheRegion(),
rootCriteria.getComment(),
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Course.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Course.java (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Course.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -0,0 +1,22 @@
+//$Id: Course.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.readonly.criteria;
+
+/**
+ * @author Gavin King
+ */
+public class Course {
+ private String courseCode;
+ private String description;
+ public String getCourseCode() {
+ return courseCode;
+ }
+ public void setCourseCode(String courseCode) {
+ this.courseCode = courseCode;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
Property changes on: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Course.java
___________________________________________________________________
Name: svn:executable
+ *
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.hbm.xml
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.hbm.xml (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.hbm.xml 2010-02-10 07:00:59 UTC (rev 18758)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.readonly.criteria">
+
+ <class name="Course">
+ <id name="courseCode">
+ <generator class="assigned"/>
+ </id>
+ <property name="description"/>
+ </class>
+
+ <class name="Student">
+ <id name="studentNumber">
+ <column name="studentId"/>
+ <generator class="assigned"/>
+ </id>
+ <property name="name" not-null="true"/>
+ <set name="enrolments" inverse="true" cascade="delete">
+ <key column="studentId"/>
+ <one-to-many class="Enrolment"/>
+ </set>
+ <many-to-one name="preferredCourse" column="preferredCourseCode"/>
+ </class>
+
+ <class name="Enrolment">
+ <composite-id>
+ <key-property name="studentNumber">
+ <column name="studentId"/>
+ </key-property>
+ <key-property name="courseCode"/>
+ </composite-id>
+ <many-to-one name="student" insert="false" update="false">
+ <column name="studentId"/>
+ </many-to-one>
+ <many-to-one name="course" insert="false" update="false">
+ <column name="courseCode"/>
+ </many-to-one>
+ <property name="semester" not-null="true"/>
+ <property name="year" not-null="true"/>
+ </class>
+
+</hibernate-mapping>
Property changes on: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.hbm.xml
___________________________________________________________________
Name: svn:executable
+ *
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.java (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -0,0 +1,63 @@
+//$Id: Enrolment.java 6970 2005-05-31 20:24:41Z oneovthafew $
+package org.hibernate.test.readonly.criteria;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Enrolment implements Serializable {
+ private Student student;
+ private Course course;
+ private long studentNumber;
+ private String courseCode;
+ private short year;
+ private short semester;
+ public String getCourseCode() {
+ return courseCode;
+ }
+ public void setCourseCode(String courseId) {
+ this.courseCode = courseId;
+ }
+ public long getStudentNumber() {
+ return studentNumber;
+ }
+ public void setStudentNumber(long studentId) {
+ this.studentNumber = studentId;
+ }
+ public Course getCourse() {
+ return course;
+ }
+ public void setCourse(Course course) {
+ this.course = course;
+ }
+ public Student getStudent() {
+ return student;
+ }
+ public void setStudent(Student student) {
+ this.student = student;
+ }
+ public short getSemester() {
+ return semester;
+ }
+ public void setSemester(short semester) {
+ this.semester = semester;
+ }
+ public short getYear() {
+ return year;
+ }
+ public void setYear(short year) {
+ this.year = year;
+ }
+
+ public boolean equals(Object other) {
+ if ( !(other instanceof Enrolment) ) return false;
+ Enrolment that = (Enrolment) other;
+ return studentNumber==that.studentNumber &&
+ courseCode.equals(that.courseCode);
+ }
+
+ public int hashCode() {
+ return courseCode.hashCode();
+ }
+}
Property changes on: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Enrolment.java
___________________________________________________________________
Name: svn:executable
+ *
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/ReadOnlyCriteriaQueryTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/ReadOnlyCriteriaQueryTest.java (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/ReadOnlyCriteriaQueryTest.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -0,0 +1,1657 @@
+//$Id: CriteriaQueryTest.java 10976 2006-12-12 23:22:26Z steve.ebersole(a)jboss.com $
+package org.hibernate.test.readonly.criteria;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.MatchMode;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projection;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.criterion.Subqueries;
+import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.proxy.LazyInitializer;
+import org.hibernate.test.hql.Animal;
+import org.hibernate.test.hql.Reptile;
+import org.hibernate.transform.Transformers;
+import org.hibernate.type.Type;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Gail Badner (adapted from org.hibernate.test.criteria.CriteriaQueryTest by Gavin King)
+ */
+public class ReadOnlyCriteriaQueryTest extends FunctionalTestCase {
+
+ public ReadOnlyCriteriaQueryTest(String str) {
+ super(str);
+ }
+
+ public String[] getMappings() {
+ return new String[] { "readonly/criteria/Enrolment.hbm.xml" };
+ }
+
+ public void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+ cfg.setProperty( Environment.CACHE_REGION_PREFIX, "criteriaquerytest" );
+ cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+ cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+ }
+
+ public static Test suite() {
+ return new FunctionalTestClassTestSuite( ReadOnlyCriteriaQueryTest.class );
+ }
+
+ public void testModifiableSessionDefaultCriteria() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ Criteria criteria = s.createCriteria( Student.class );
+ assertFalse( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ assertFalse( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testModifiableSessionReadOnlyCriteria() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testModifiableSessionModifiableCriteria() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ Criteria criteria = s.createCriteria( Student.class );
+ assertFalse( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ criteria.setReadOnly( false );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ assertFalse( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testReadOnlySessionDefaultCriteria() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ s.setDefaultReadOnly( true );
+ Criteria criteria = s.createCriteria( Student.class );
+ assertTrue( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertTrue( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertTrue( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testReadOnlySessionReadOnlyCriteria() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ s.setDefaultReadOnly( true );
+ Criteria criteria = s.createCriteria( Student.class );
+ assertTrue( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ criteria.setReadOnly( true );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertTrue( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertTrue( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testReadOnlySessionModifiableCriteria() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ s.setDefaultReadOnly( true );
+ Criteria criteria = s.createCriteria( Student.class );
+ assertTrue( s.isDefaultReadOnly() );
+ assertFalse( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ criteria.setReadOnly( false );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertTrue( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ assertFalse( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), false);
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertTrue( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testReadOnlyCriteriaReturnsModifiableExistingEntity() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ assertFalse( s.isDefaultReadOnly() );
+ coursePreferred = ( Course ) s.get( Course.class, coursePreferred.getCourseCode() );
+ assertFalse( s.isReadOnly( coursePreferred ) );
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertFalse( s.isReadOnly( coursePreferred ) );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testReadOnlyCriteriaReturnsExistingModifiableProxyNotInit() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ assertFalse( s.isDefaultReadOnly() );
+ coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+ assertFalse( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, false );
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, false );
+ Hibernate.initialize( coursePreferred );
+ checkProxyReadOnly( s, coursePreferred, false );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testReadOnlyCriteriaReturnsExistingModifiableProxyInit() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ assertFalse( s.isDefaultReadOnly() );
+ coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+ assertFalse( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, false );
+ Hibernate.initialize( coursePreferred );
+ checkProxyReadOnly( s, coursePreferred, false );
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertTrue( criteria.isReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertTrue( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, false );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testModifiableCriteriaReturnsExistingReadOnlyEntity() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ assertFalse( s.isDefaultReadOnly() );
+ coursePreferred = ( Course ) s.get( Course.class, coursePreferred.getCourseCode() );
+ assertFalse( s.isReadOnly( coursePreferred ) );
+ s.setReadOnly( coursePreferred, true );
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( false );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ assertFalse( s.isReadOnly( gavin ) );
+ assertTrue( s.isReadOnly( coursePreferred ) );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testModifiableCriteriaReturnsExistingReadOnlyProxyNotInit() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ assertFalse( s.isDefaultReadOnly() );
+ coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+ assertFalse( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, false );
+ s.setReadOnly( coursePreferred, true );
+ checkProxyReadOnly( s, coursePreferred, true );
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( false );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ assertFalse( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, true );
+ Hibernate.initialize( coursePreferred );
+ checkProxyReadOnly( s, coursePreferred, true );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testModifiableCriteriaReturnsExistingReadOnlyProxyInit() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add( enrolment );
+ s.persist( enrolment );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ assertFalse( s.isDefaultReadOnly() );
+ coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+ assertFalse( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, false );
+ Hibernate.initialize( coursePreferred );
+ checkProxyReadOnly( s, coursePreferred, false );
+ s.setReadOnly( coursePreferred, true );
+ checkProxyReadOnly( s, coursePreferred, true );
+ Criteria criteria = s.createCriteria( Student.class ).setReadOnly( false );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ gavin = ( Student ) criteria.uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( criteria.isReadOnlyInitialized() );
+ assertFalse( criteria.isReadOnly() );
+ assertFalse( s.isReadOnly( gavin ) );
+ assertTrue( Hibernate.isInitialized( coursePreferred ) );
+ checkProxyReadOnly( s, coursePreferred, true );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testScrollCriteria() {
+ Session session = openSession();
+ Transaction t = session.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ session.persist(course);
+ session.flush();
+ session.clear();
+ ScrollableResults sr = session.createCriteria(Course.class).setReadOnly( true ).scroll();
+ assertTrue( sr.next() );
+ course = (Course) sr.get(0);
+ assertNotNull(course);
+ assertTrue( session.isReadOnly( course ) );
+ sr.close();
+ session.delete(course);
+
+ t.commit();
+ session.close();
+
+ }
+
+ public void testSubselect() {
+
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.persist(course);
+
+ Course coursePreferred = new Course();
+ coursePreferred.setCourseCode( "JBOSS" );
+ coursePreferred.setDescription( "JBoss" );
+ s.persist( coursePreferred );
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse( coursePreferred );
+ s.persist(gavin);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add(enrolment);
+ s.persist(enrolment);
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+ .add( Property.forName("studentNumber").eq( new Long(232) ) )
+ .setProjection( Property.forName("name") );
+ gavin = ( Student ) s.createCriteria(Student.class)
+ .add( Subqueries.exists(dc) )
+ .setReadOnly( true )
+ .uniqueResult();
+ assertFalse( s.isDefaultReadOnly() );
+ assertTrue( s.isReadOnly( gavin ) );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ Hibernate.initialize( gavin.getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+ checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+ assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ Hibernate.initialize( gavin.getEnrolments() );
+ assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+ assertEquals( 1, gavin.getEnrolments().size() );
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ assertFalse( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ Hibernate.initialize( enrolment.getCourse() );
+ checkProxyReadOnly( s, enrolment.getCourse(), false );
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ DetachedCriteria dc2 = DetachedCriteria.forClass(Student.class, "st")
+ .add( Property.forName("st.studentNumber").eqProperty("e.studentNumber") )
+ .setProjection( Property.forName("name") );
+ enrolment = ( Enrolment ) s.createCriteria(Enrolment.class, "e")
+ .add( Subqueries.eq("Gavin King", dc2) )
+ .setReadOnly( true )
+ .uniqueResult();
+ assertTrue( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ Hibernate.initialize( enrolment.getCourse() );
+ assertTrue( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ assertFalse( Hibernate.isInitialized( enrolment.getStudent() ) );
+ checkProxyReadOnly( s, enrolment.getStudent(), true );
+ Hibernate.initialize( enrolment.getStudent() );
+ assertTrue( Hibernate.isInitialized( enrolment.getStudent() ) );
+ checkProxyReadOnly( s, enrolment.getStudent(), true );
+ assertFalse( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+ checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+ Hibernate.initialize( enrolment.getStudent().getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+ checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ DetachedCriteria dc3 = DetachedCriteria.forClass(Student.class, "st")
+ .createCriteria("enrolments")
+ .createCriteria("course")
+ .add( Property.forName("description").eq("Hibernate Training") )
+ .setProjection( Property.forName("st.name") );
+ enrolment = ( Enrolment ) s.createCriteria(Enrolment.class, "e")
+ .add( Subqueries.eq("Gavin King", dc3) )
+ .setReadOnly( true )
+ .uniqueResult();
+ assertTrue( s.isReadOnly( enrolment ) );
+ assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ Hibernate.initialize( enrolment.getCourse() );
+ assertTrue( Hibernate.isInitialized( enrolment.getCourse() ) );
+ checkProxyReadOnly( s, enrolment.getCourse(), true );
+ assertFalse( Hibernate.isInitialized( enrolment.getStudent() ) );
+ checkProxyReadOnly( s, enrolment.getStudent(), true );
+ Hibernate.initialize( enrolment.getStudent() );
+ assertTrue( Hibernate.isInitialized( enrolment.getStudent() ) );
+ checkProxyReadOnly( s, enrolment.getStudent(), true );
+ assertFalse( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+ checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+ Hibernate.initialize( enrolment.getStudent().getPreferredCourse() );
+ assertTrue( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+ checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+ s.delete(gavin.getPreferredCourse());
+ s.delete(gavin);
+ enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+ s.delete( enrolment.getCourse() );
+ s.delete(enrolment);
+ t.commit();
+ s.close();
+ }
+
+ public void testDetachedCriteria() {
+
+ DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+ .add( Property.forName("name").eq("Gavin King") )
+ .addOrder( Order.asc("studentNumber") );
+
+ byte[] bytes = SerializationHelper.serialize(dc);
+
+ dc = (DetachedCriteria) SerializationHelper.deserialize(bytes);
+
+ Session session = openSession();
+ Transaction t = session.beginTransaction();
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ Student bizarroGavin = new Student();
+ bizarroGavin.setName("Gavin King");
+ bizarroGavin.setStudentNumber(666);
+ session.persist(bizarroGavin);
+ session.persist(gavin);
+
+ t.commit();
+ session.close();
+
+ session = openSession();
+ t = session.beginTransaction();
+
+ List result = dc.getExecutableCriteria(session)
+ .setMaxResults(3)
+ .setReadOnly( true )
+ .list();
+
+ assertEquals( result.size(), 2 );
+ gavin = ( Student ) result.get( 0 );
+ bizarroGavin = ( Student ) result.get( 1 );
+ assertEquals( 232, gavin.getStudentNumber() );
+ assertEquals( 666, bizarroGavin.getStudentNumber() );
+ assertTrue( session.isReadOnly( gavin ) );
+ assertTrue( session.isReadOnly( bizarroGavin ) );
+
+ session.delete(gavin);
+ session.delete(bizarroGavin);
+ t.commit();
+ session.close();
+ }
+
+ public void testTwoAliasesCache() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.save(course);
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(666);
+ s.save(gavin);
+
+ Student xam = new Student();
+ xam.setName("Max Rydahl Andersen");
+ xam.setStudentNumber(101);
+ s.save(xam);
+
+ Enrolment enrolment1 = new Enrolment();
+ enrolment1.setCourse(course);
+ enrolment1.setCourseCode(course.getCourseCode());
+ enrolment1.setSemester((short) 1);
+ enrolment1.setYear((short) 1999);
+ enrolment1.setStudent(xam);
+ enrolment1.setStudentNumber(xam.getStudentNumber());
+ xam.getEnrolments().add(enrolment1);
+ s.save(enrolment1);
+
+ Enrolment enrolment2 = new Enrolment();
+ enrolment2.setCourse(course);
+ enrolment2.setCourseCode(course.getCourseCode());
+ enrolment2.setSemester((short) 3);
+ enrolment2.setYear((short) 1998);
+ enrolment2.setStudent(gavin);
+ enrolment2.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add(enrolment2);
+ s.save(enrolment2);
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+
+ List list = s.createCriteria(Enrolment.class)
+ .createAlias("student", "s")
+ .createAlias("course", "c")
+ .add( Restrictions.isNotEmpty("s.enrolments") )
+ .setCacheable(true)
+ .setReadOnly( true )
+ .list();
+
+ assertEquals( list.size(), 2 );
+
+ Enrolment e = ( Enrolment ) list.get( 0 );
+ if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+ enrolment1 = e;
+ enrolment2 = ( Enrolment ) list.get( 1 );
+ }
+ else if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+ enrolment2 = e;
+ enrolment1 = ( Enrolment ) list.get( 1 );
+ }
+ else {
+ fail( "Enrolment has unknown student number: " + e.getStudent().getStudentNumber() );
+ }
+
+ assertTrue( s.isReadOnly( enrolment1 ) );
+ assertTrue( s.isReadOnly( enrolment2 ) );
+ assertTrue( s.isReadOnly( enrolment1.getCourse() ) );
+ assertTrue( s.isReadOnly( enrolment2.getCourse() ) );
+ assertSame( enrolment1.getCourse(), enrolment2.getCourse() );
+ assertTrue( s.isReadOnly( enrolment1.getStudent() ) );
+ assertTrue( s.isReadOnly( enrolment2.getStudent() ) );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+
+ list = s.createCriteria(Enrolment.class)
+ .createAlias("student", "s")
+ .createAlias("course", "c")
+ .setReadOnly( true )
+ .add( Restrictions.isNotEmpty("s.enrolments") )
+ .setCacheable(true)
+ .setReadOnly( true )
+ .list();
+
+ assertEquals( list.size(), 2 );
+
+ e = ( Enrolment ) list.get( 0 );
+ if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+ enrolment1 = e;
+ enrolment2 = ( Enrolment ) list.get( 1 );
+ }
+ else if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+ enrolment2 = e;
+ enrolment1 = ( Enrolment ) list.get( 1 );
+ }
+ else {
+ fail( "Enrolment has unknown student number: " + e.getStudent().getStudentNumber() );
+ }
+
+ assertTrue( s.isReadOnly( enrolment1 ) );
+ assertTrue( s.isReadOnly( enrolment2 ) );
+ assertTrue( s.isReadOnly( enrolment1.getCourse() ) );
+ assertTrue( s.isReadOnly( enrolment2.getCourse() ) );
+ assertSame( enrolment1.getCourse(), enrolment2.getCourse() );
+ assertTrue( s.isReadOnly( enrolment1.getStudent() ) );
+ assertTrue( s.isReadOnly( enrolment2.getStudent() ) );
+
+ t.commit();
+ s.close();
+
+ s = openSession();
+ t = s.beginTransaction();
+
+ list = s.createCriteria(Enrolment.class)
+ .setReadOnly( true )
+ .createAlias("student", "s")
+ .createAlias("course", "c")
+ .add( Restrictions.isNotEmpty("s.enrolments") )
+ .setCacheable(true)
+ .list();
+
+ assertEquals( list.size(), 2 );
+
+ e = ( Enrolment ) list.get( 0 );
+ if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+ enrolment1 = e;
+ enrolment2 = ( Enrolment ) list.get( 1 );
+ }
+ else if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+ enrolment2 = e;
+ enrolment1 = ( Enrolment ) list.get( 1 );
+ }
+ else {
+ fail( "Enrolment has unknown student number: " + e.getStudent().getStudentNumber() );
+ }
+
+ assertTrue( s.isReadOnly( enrolment1 ) );
+ assertTrue( s.isReadOnly( enrolment2 ) );
+ assertTrue( s.isReadOnly( enrolment1.getCourse() ) );
+ assertTrue( s.isReadOnly( enrolment2.getCourse() ) );
+ assertSame( enrolment1.getCourse(), enrolment2.getCourse() );
+ assertTrue( s.isReadOnly( enrolment1.getStudent() ) );
+ assertTrue( s.isReadOnly( enrolment2.getStudent() ) );
+
+ s.delete( enrolment1 );
+ s.delete( enrolment2 );
+ s.delete( enrolment1.getCourse() );
+ s.delete( enrolment1.getStudent() );
+ s.delete( enrolment2.getStudent() );
+
+ t.commit();
+ s.close();
+ }
+
+ /*
+ public void testProjectionsUsingProperty() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Course course = new Course();
+ course.setCourseCode("HIB");
+ course.setDescription("Hibernate Training");
+ s.save(course);
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(667);
+ s.save(gavin);
+
+ Student xam = new Student();
+ xam.setName("Max Rydahl Andersen");
+ xam.setStudentNumber(101);
+ s.save(xam);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 1);
+ enrolment.setYear((short) 1999);
+ enrolment.setStudent(xam);
+ enrolment.setStudentNumber(xam.getStudentNumber());
+ xam.getEnrolments().add(enrolment);
+ s.save(enrolment);
+
+ enrolment = new Enrolment();
+ enrolment.setCourse(course);
+ enrolment.setCourseCode(course.getCourseCode());
+ enrolment.setSemester((short) 3);
+ enrolment.setYear((short) 1998);
+ enrolment.setStudent(gavin);
+ enrolment.setStudentNumber(gavin.getStudentNumber());
+ gavin.getEnrolments().add(enrolment);
+ s.save(enrolment);
+
+ s.flush();
+
+ Long count = (Long) s.createCriteria(Enrolment.class)
+ .setProjection( Property.forName("studentNumber").count().setDistinct() )
+ .uniqueResult();
+ assertEquals(count, new Long(2));
+
+ Object object = s.createCriteria(Enrolment.class)
+ .setProjection( Projections.projectionList()
+ .add( Property.forName("studentNumber").count() )
+ .add( Property.forName("studentNumber").max() )
+ .add( Property.forName("studentNumber").min() )
+ .add( Property.forName("studentNumber").avg() )
+ )
+ .uniqueResult();
+ Object[] result = (Object[])object;
+
+ assertEquals(new Long(2),result[0]);
+ assertEquals(new Long(667),result[1]);
+ assertEquals(new Long(101),result[2]);
+ assertEquals(384.0, ( (Double) result[3] ).doubleValue(), 0.01);
+
+
+ s.createCriteria(Enrolment.class)
+ .add( Property.forName("studentNumber").gt( new Long(665) ) )
+ .add( Property.forName("studentNumber").lt( new Long(668) ) )
+ .add( Property.forName("courseCode").like("HIB", MatchMode.START) )
+ .add( Property.forName("year").eq( new Short( (short) 1999 ) ) )
+ .addOrder( Property.forName("studentNumber").asc() )
+ .uniqueResult();
+
+ List resultWithMaps = s.createCriteria(Enrolment.class)
+ .setProjection( Projections.projectionList()
+ .add( Property.forName("studentNumber").as("stNumber") )
+ .add( Property.forName("courseCode").as("cCode") )
+ )
+ .add( Property.forName("studentNumber").gt( new Long(665) ) )
+ .add( Property.forName("studentNumber").lt( new Long(668) ) )
+ .addOrder( Property.forName("studentNumber").asc() )
+ .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+ .list();
+
+ assertEquals(1, resultWithMaps.size());
+ Map m1 = (Map) resultWithMaps.get(0);
+
+ assertEquals(new Long(667), m1.get("stNumber"));
+ assertEquals(course.getCourseCode(), m1.get("cCode"));
+
+ resultWithMaps = s.createCriteria(Enrolment.class)
+ .setProjection( Property.forName("studentNumber").as("stNumber") )
+ .addOrder( Order.desc("stNumber") )
+ .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+ .list();
+
+ assertEquals(2, resultWithMaps.size());
+ Map m0 = (Map) resultWithMaps.get(0);
+ m1 = (Map) resultWithMaps.get(1);
+
+ assertEquals(new Long(101), m1.get("stNumber"));
+ assertEquals(new Long(667), m0.get("stNumber"));
+
+
+ List resultWithAliasedBean = s.createCriteria(Enrolment.class)
+ .createAlias("student", "st")
+ .createAlias("course", "co")
+ .setProjection( Projections.projectionList()
+ .add( Property.forName("st.name").as("studentName") )
+ .add( Property.forName("co.description").as("courseDescription") )
+ )
+ .addOrder( Order.desc("studentName") )
+ .setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )
+ .list();
+
+ assertEquals(2, resultWithAliasedBean.size());
+
+ StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0);
+ assertNotNull(dto.getDescription());
+ assertNotNull(dto.getName());
+
+ s.createCriteria(Student.class)
+ .add( Restrictions.like("name", "Gavin", MatchMode.START) )
+ .addOrder( Order.asc("name") )
+ .createCriteria("enrolments", "e")
+ .addOrder( Order.desc("year") )
+ .addOrder( Order.desc("semester") )
+ .createCriteria("course","c")
+ .addOrder( Order.asc("description") )
+ .setProjection( Projections.projectionList()
+ .add( Property.forName("this.name") )
+ .add( Property.forName("e.year") )
+ .add( Property.forName("e.semester") )
+ .add( Property.forName("c.courseCode") )
+ .add( Property.forName("c.description") )
+ )
+ .uniqueResult();
+
+ Projection p1 = Projections.projectionList()
+ .add( Property.forName("studentNumber").count() )
+ .add( Property.forName("studentNumber").max() )
+ .add( Projections.rowCount() );
+
+ Projection p2 = Projections.projectionList()
+ .add( Property.forName("studentNumber").min() )
+ .add( Property.forName("studentNumber").avg() )
+ .add( Projections.sqlProjection(
+ "1 as constOne, count(*) as countStar",
+ new String[] { "constOne", "countStar" },
+ new Type[] { Hibernate.INTEGER, Hibernate.INTEGER }
+ ) );
+
+ Object[] array = (Object[]) s.createCriteria(Enrolment.class)
+ .setProjection( Projections.projectionList().add(p1).add(p2) )
+ .uniqueResult();
+
+ assertEquals( array.length, 7 );
+
+ List list = s.createCriteria(Enrolment.class)
+ .createAlias("student", "st")
+ .createAlias("course", "co")
+ .setProjection( Projections.projectionList()
+ .add( Property.forName("co.courseCode").group() )
+ .add( Property.forName("st.studentNumber").count().setDistinct() )
+ .add( Property.forName("year").group() )
+ )
+ .list();
+
+ assertEquals( list.size(), 2 );
+
+ s.delete(gavin);
+ s.delete(xam);
+ s.delete(course);
+
+ t.commit();
+ s.close();
+ }
+
+ public void testRestrictionOnSubclassCollection() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ s.createCriteria( Reptile.class )
+ .add( Restrictions.isEmpty( "offspring" ) )
+ .list();
+
+ s.createCriteria( Reptile.class )
+ .add( Restrictions.isNotEmpty( "offspring" ) )
+ .list();
+
+ t.rollback();
+ s.close();
+ }
+
+ public void testClassProperty() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ // HQL: from Animal a where a.mother.class = Reptile
+ Criteria c = s.createCriteria(Animal.class,"a")
+ .createAlias("mother","m")
+ .add( Property.forName("m.class").eq(Reptile.class) );
+ c.list();
+ t.rollback();
+ s.close();
+ }
+
+ public void testProjectedId() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+ s.createCriteria(Course.class).setProjection( Projections.property("courseCode") ).list();
+ s.createCriteria(Course.class).setProjection( Projections.id() ).list();
+ t.rollback();
+ s.close();
+ }
+
+ public void testSubcriteriaJoinTypes() {
+ Session session = openSession();
+ Transaction t = session.beginTransaction();
+
+ Course courseA = new Course();
+ courseA.setCourseCode("HIB-A");
+ courseA.setDescription("Hibernate Training A");
+ session.persist(courseA);
+
+ Course courseB = new Course();
+ courseB.setCourseCode("HIB-B");
+ courseB.setDescription("Hibernate Training B");
+ session.persist(courseB);
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse(courseA);
+ session.persist(gavin);
+
+ Student leonardo = new Student();
+ leonardo.setName("Leonardo Quijano");
+ leonardo.setStudentNumber(233);
+ leonardo.setPreferredCourse(courseB);
+ session.persist(leonardo);
+
+ Student johnDoe = new Student();
+ johnDoe.setName("John Doe");
+ johnDoe.setStudentNumber(235);
+ johnDoe.setPreferredCourse(null);
+ session.persist(johnDoe);
+
+ List result = session.createCriteria( Student.class )
+ .setProjection( Property.forName("preferredCourse.courseCode") )
+ .createCriteria( "preferredCourse", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "courseCode" ) )
+ .list();
+ assertEquals( 3, result.size() );
+ // can't be sure of NULL comparison ordering aside from they should
+ // either come first or last
+ if ( result.get( 0 ) == null ) {
+ assertEquals( "HIB-A", result.get(1) );
+ assertEquals( "HIB-B", result.get(2) );
+ }
+ else {
+ assertNull( result.get(2) );
+ assertEquals( "HIB-A", result.get(0) );
+ assertEquals( "HIB-B", result.get(1) );
+ }
+
+ result = session.createCriteria( Student.class )
+ .setFetchMode( "preferredCourse", FetchMode.JOIN )
+ .createCriteria( "preferredCourse", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "courseCode" ) )
+ .list();
+ assertEquals( 3, result.size() );
+ assertNotNull( result.get(0) );
+ assertNotNull( result.get(1) );
+ assertNotNull( result.get(2) );
+
+ result = session.createCriteria( Student.class )
+ .setFetchMode( "preferredCourse", FetchMode.JOIN )
+ .createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN )
+ .addOrder( Order.asc( "pc.courseCode" ) )
+ .list();
+ assertEquals( 3, result.size() );
+ assertNotNull( result.get(0) );
+ assertNotNull( result.get(1) );
+ assertNotNull( result.get(2) );
+
+ session.delete(gavin);
+ session.delete(leonardo);
+ session.delete(johnDoe);
+ session.delete(courseA);
+ session.delete(courseB);
+ t.commit();
+ session.close();
+ }
+
+ public void testAliasJoinCriterion() {
+ Session session = openSession();
+ Transaction t = session.beginTransaction();
+
+ Course courseA = new Course();
+ courseA.setCourseCode("HIB-A");
+ courseA.setDescription("Hibernate Training A");
+ session.persist(courseA);
+
+ Course courseB = new Course();
+ courseB.setCourseCode("HIB-B");
+ courseB.setDescription("Hibernate Training B");
+ session.persist(courseB);
+
+ Student gavin = new Student();
+ gavin.setName("Gavin King");
+ gavin.setStudentNumber(232);
+ gavin.setPreferredCourse(courseA);
+ session.persist(gavin);
+
+ Student leonardo = new Student();
+ leonardo.setName("Leonardo Quijano");
+ leonardo.setStudentNumber(233);
+ leonardo.setPreferredCourse(courseB);
+ session.persist(leonardo);
+
+ Student johnDoe = new Student();
+ johnDoe.setName("John Doe");
+ johnDoe.setStudentNumber(235);
+ johnDoe.setPreferredCourse(null);
+ session.persist(johnDoe);
+
+ // test == on one value exists
+ List result = session.createCriteria( Student.class )
+ .createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.eq("pc.courseCode", "HIB-A") )
+ .setProjection( Property.forName("pc.courseCode") )
+ .addOrder(Order.asc("pc.courseCode"))
+ .list();
+
+ assertEquals( 3, result.size() );
+
+ // can't be sure of NULL comparison ordering aside from they should
+ // either come first or last
+ if ( result.get( 0 ) == null ) {
+ assertNull(result.get(1));
+ assertEquals( "HIB-A", result.get(2) );
+ }
+ else {
+ assertNull( result.get(2) );
+ assertNull( result.get(1) );
+ assertEquals( "HIB-A", result.get(0) );
+ }
+
+ // test == on non existent value
+ result = session.createCriteria( Student.class )
+ .createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.eq("pc.courseCode", "HIB-R") )
+ .setProjection( Property.forName("pc.courseCode") )
+ .addOrder(Order.asc("pc.courseCode"))
+ .list();
+
+ assertEquals( 3, result.size() );
+ assertNull( result.get(2) );
+ assertNull( result.get(1) );
+ assertNull(result.get(0) );
+
+ // test != on one existing value
+ result = session.createCriteria( Student.class )
+ .createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.ne("pc.courseCode", "HIB-A") )
+ .setProjection( Property.forName("pc.courseCode") )
+ .addOrder(Order.asc("pc.courseCode"))
+ .list();
+
+ assertEquals( 3, result.size() );
+ // can't be sure of NULL comparison ordering aside from they should
+ // either come first or last
+ if ( result.get( 0 ) == null ) {
+ assertNull( result.get(1) );
+ assertEquals( "HIB-B", result.get(2) );
+ }
+ else {
+ assertEquals( "HIB-B", result.get(0) );
+ assertNull( result.get(1) );
+ assertNull( result.get(2) );
+ }
+
+ session.delete(gavin);
+ session.delete(leonardo);
+ session.delete(johnDoe);
+ session.delete(courseA);
+ session.delete(courseB);
+ t.commit();
+ session.close();
+ }
+ */
+
+ private void checkProxyReadOnly(Session s, Object proxy, boolean expectedReadOnly) {
+ assertTrue( proxy instanceof HibernateProxy );
+ LazyInitializer li = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer();
+ assertSame( s, li.getSession() );
+ assertEquals( expectedReadOnly, s.isReadOnly( proxy ) );
+ assertEquals( expectedReadOnly, li.isReadOnly() );
+ assertEquals( Hibernate.isInitialized( proxy ), ! li.isUninitialized() );
+ if ( Hibernate.isInitialized( proxy ) ) {
+ assertEquals( expectedReadOnly, s.isReadOnly( li.getImplementation() ) );
+ }
+ }
+
+}
+
Property changes on: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/ReadOnlyCriteriaQueryTest.java
___________________________________________________________________
Name: svn:executable
+ *
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Student.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Student.java (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Student.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -0,0 +1,47 @@
+//$Id: Student.java 9116 2006-01-23 21:21:01Z steveebersole $
+package org.hibernate.test.readonly.criteria;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Student {
+ private long studentNumber;
+ private String name;
+ private Course preferredCourse;
+ private Set enrolments = new HashSet();
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public long getStudentNumber() {
+ return studentNumber;
+ }
+
+ public void setStudentNumber(long studentNumber) {
+ this.studentNumber = studentNumber;
+ }
+
+ public Course getPreferredCourse() {
+ return preferredCourse;
+ }
+
+ public void setPreferredCourse(Course preferredCourse) {
+ this.preferredCourse = preferredCourse;
+ }
+
+ public Set getEnrolments() {
+ return enrolments;
+ }
+
+ public void setEnrolments(Set employments) {
+ this.enrolments = employments;
+ }
+}
Property changes on: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/Student.java
___________________________________________________________________
Name: svn:executable
+ *
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/StudentDTO.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/StudentDTO.java (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/readonly/criteria/StudentDTO.java 2010-02-10 07:00:59 UTC (rev 18758)
@@ -0,0 +1,26 @@
+/*
+ * Created on 28-Jan-2005
+ *
+ */
+package org.hibernate.test.readonly.criteria;
+
+/**
+ * @author max
+ *
+ */
+public class StudentDTO {
+
+ private String studentName;
+ private String courseDescription;
+
+ public StudentDTO() { }
+
+ public String getName() {
+ return studentName;
+ }
+
+ public String getDescription() {
+ return courseDescription;
+ }
+
+}
16 years, 2 months
Hibernate SVN: r18756 - in jpamodelgen/trunk/src: test/java/org/hibernate/jpamodelgen/test/mixedmode and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-02-09 17:12:14 -0500 (Tue, 09 Feb 2010)
New Revision: 18756
Added:
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Insurance.java
Modified:
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java
Log:
METAGEN-9 Added support for Embeddable
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java 2010-02-09 21:50:09 UTC (rev 18755)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java 2010-02-09 22:12:14 UTC (rev 18756)
@@ -41,6 +41,7 @@
import javax.persistence.AccessType;
import javax.persistence.Basic;
import javax.persistence.ElementCollection;
+import javax.persistence.Embeddable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKeyClass;
@@ -476,6 +477,9 @@
if ( BASIC_TYPES.contains( typeName ) ) {
return Boolean.TRUE;
}
+ if ( TypeUtils.containsAnnotation( element, Embeddable.class ) ) {
+ return Boolean.TRUE;
+ }
for ( TypeMirror mirror : typeElement.getInterfaces() ) {
TypeElement interfaceElement = ( TypeElement ) context.getProcessingEnvironment()
.getTypeUtils()
Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Insurance.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Insurance.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Insurance.java 2010-02-09 22:12:14 UTC (rev 18756)
@@ -0,0 +1,47 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Hardy Ferentschik
+ */
+@Embeddable
+public class Insurance {
+ String number;
+ String policyNumber;
+
+ public String getPolicyNumber() {
+ return policyNumber;
+ }
+
+ public void setPolicyNumber(String policyNumber) {
+ this.policyNumber = policyNumber;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+}
+
+
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java 2010-02-09 21:50:09 UTC (rev 18755)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java 2010-02-09 22:12:14 UTC (rev 18756)
@@ -57,6 +57,9 @@
assertPresenceOfFieldInMetamodelFor(
RentalCar.class, "company", "Property 'company' should be included due to xml configuration"
);
+ assertPresenceOfFieldInMetamodelFor(
+ RentalCar.class, "insurance", "Property 'insurance' should be included since it is an embeddable"
+ );
}
@Override
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java 2010-02-09 21:50:09 UTC (rev 18755)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java 2010-02-09 22:12:14 UTC (rev 18756)
@@ -31,6 +31,8 @@
private Character[] chassisNumber;
+ private Insurance insurance;
+
public RentalCompany getCompany() {
return company;
}
@@ -55,6 +57,14 @@
this.hired = hired;
}
+ public Insurance getInsurance() {
+ return insurance;
+ }
+
+ public void setInsurance(Insurance insurance) {
+ this.insurance = insurance;
+ }
+
enum CURRENTLY_HIRED {
YES, NO
}
16 years, 2 months
Hibernate SVN: r18755 - core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b2.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-09 16:50:09 -0500 (Tue, 09 Feb 2010)
New Revision: 18755
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b2/IdClassGeneratedValueManyToOneTest.java
Log:
HHH-4894 - Process composite-id sub-generators PersistentIdentifierGenerator contract(s)
Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b2/IdClassGeneratedValueManyToOneTest.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b2/IdClassGeneratedValueManyToOneTest.java 2010-02-09 21:45:15 UTC (rev 18754)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b2/IdClassGeneratedValueManyToOneTest.java 2010-02-09 21:50:09 UTC (rev 18755)
@@ -1,3 +1,26 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
package org.hibernate.test.annotations.derivedidentities.e1.b2;
import java.math.BigDecimal;
@@ -5,18 +28,15 @@
import org.hibernate.Session;
import org.hibernate.Transaction;
-import org.hibernate.junit.FailureExpected;
import org.hibernate.test.annotations.TestCase;
/**
* A test.
*
* @author <a href="mailto:stale.pedersen@jboss.org">Stale W. Pedersen</a>
- * @version $Revision: 1.1 $
*/
public class IdClassGeneratedValueManyToOneTest extends TestCase {
- @FailureExpected(jiraKey="HHH-4890")
public void testComplexIdClass() {
Session s = openSession();
Transaction tx = s.beginTransaction();
16 years, 2 months
Hibernate SVN: r18754 - in core/trunk: annotations/src/test/resources and 3 other directories.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-09 16:45:15 -0500 (Tue, 09 Feb 2010)
New Revision: 18754
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/a/DerivedIdentitySimpleParentIdClassDepTest.java
core/trunk/annotations/src/test/resources/log4j.properties
core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractPropertyMapping.java
core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java
core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java
core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java
Log:
HHH-4895 - query against derived id doesn't return expected result
Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/a/DerivedIdentitySimpleParentIdClassDepTest.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/a/DerivedIdentitySimpleParentIdClassDepTest.java 2010-02-09 21:29:34 UTC (rev 18753)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/a/DerivedIdentitySimpleParentIdClassDepTest.java 2010-02-09 21:45:15 UTC (rev 18754)
@@ -1,5 +1,6 @@
package org.hibernate.test.annotations.derivedidentities.e1.a;
+import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.test.annotations.TestCase;
import org.hibernate.test.util.SchemaUtil;
@@ -50,14 +51,11 @@
// List depList = s.createQuery("Select d from Dependent d where d.name='LittleP'").list();
// the following query is not finding the entity 'd' added above
- List depList = s.createQuery("Select d from Dependent d where d.name='LittleP' and d.emp.name='Paula'").list();
- Object newDependent = null;
- if (depList.size() > 0) {
- newDependent = (Dependent) depList.get(0);
- }
- if (newDependent != d) {
- fail("PC entity instance (" + d +") does not match returned query result value (" + newDependent);
- }
+ Query query = s.createQuery("Select d from Dependent d where d.name='LittleP' and d.emp.empName='Paula'");
+ List depList = query.list();
+ assertEquals( 1, depList.size() );
+ Object newDependent = (Dependent) depList.get(0);
+ assertSame( d, newDependent );
s.getTransaction().rollback();
s.close();
}
Modified: core/trunk/annotations/src/test/resources/log4j.properties
===================================================================
--- core/trunk/annotations/src/test/resources/log4j.properties 2010-02-09 21:29:34 UTC (rev 18753)
+++ core/trunk/annotations/src/test/resources/log4j.properties 2010-02-09 21:45:15 UTC (rev 18754)
@@ -30,7 +30,7 @@
#log4j.logger.org.hibernate.engine.CascadingAction=debug
### log JDBC bind parameters ###
-log4j.logger.org.hibernate.type=debug
+log4j.logger.org.hibernate.type=trace
### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug
Modified: core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractPropertyMapping.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractPropertyMapping.java 2010-02-09 21:29:34 UTC (rev 18753)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractPropertyMapping.java 2010-02-09 21:45:15 UTC (rev 18754)
@@ -27,6 +27,9 @@
import java.util.HashMap;
import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import org.hibernate.MappingException;
import org.hibernate.QueryException;
import org.hibernate.engine.Mapping;
@@ -44,6 +47,7 @@
* @author Gavin King
*/
public abstract class AbstractPropertyMapping implements PropertyMapping {
+ private static final Logger log = LoggerFactory.getLogger( AbstractPropertyMapping.class );
private final Map typesByPropertyPath = new HashMap();
private final Map columnsByPropertyPath = new HashMap();
@@ -124,9 +128,24 @@
return result;
}
- protected void addPropertyPath(String path, Type type, String[] columns,
- String[] columnReaders, String[] columnReaderTemplates,
+ protected void addPropertyPath(
+ String path,
+ Type type,
+ String[] columns,
+ String[] columnReaders,
+ String[] columnReaderTemplates,
String[] formulaTemplates) {
+ // TODO : not quite sure yet of the difference, but this is only needed from annotations for @Id @ManyToOne support
+ if ( typesByPropertyPath.containsKey( path ) ) {
+ if ( log.isTraceEnabled() ) {
+ log.trace(
+ "Skipping duplicate registration of path [" + path
+ + "], existing type = [" + typesByPropertyPath.get(path)
+ + "], incoming type = [" + type + "]"
+ );
+ }
+ return;
+ }
typesByPropertyPath.put(path, type);
columnsByPropertyPath.put(path, columns);
columnReadersByPropertyPath.put(path, columnReaders);
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java 2010-02-09 21:29:34 UTC (rev 18753)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java 2010-02-09 21:45:15 UTC (rev 18754)
@@ -1,5 +1,7 @@
package org.hibernate.test.keymanytoone.bidir.component;
+import java.util.List;
+
import junit.framework.Test;
import org.hibernate.HibernateException;
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java 2010-02-09 21:29:34 UTC (rev 18753)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java 2010-02-09 21:45:15 UTC (rev 18754)
@@ -1,5 +1,7 @@
package org.hibernate.test.keymanytoone.bidir.component;
+import java.util.List;
+
import junit.framework.Test;
import org.hibernate.Session;
@@ -29,6 +31,32 @@
cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
}
+ public void testQueryingOnMany2One() {
+ Session s = openSession();
+ s.beginTransaction();
+ Customer cust = new Customer( "Acme, Inc." );
+ Order order = new Order( new Order.Id( cust, 1 ) );
+ cust.getOrders().add( order );
+ s.save( cust );
+ s.getTransaction().commit();
+ s.close();
+
+ s = openSession();
+ s.beginTransaction();
+ List results = s.createQuery( "from Order o where o.id.customer.name = :name" )
+ .setParameter( "name", cust.getName() )
+ .list();
+ assertEquals( 1, results.size() );
+ s.getTransaction().commit();
+ s.close();
+
+ s = openSession();
+ s.beginTransaction();
+ s.delete( cust );
+ s.getTransaction().commit();
+ s.close();
+ }
+
public void testSaveCascadedToKeyManyToOne() {
// test cascading a save to an association with a key-many-to-one which refers to a
// just saved entity
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java 2010-02-09 21:29:34 UTC (rev 18753)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java 2010-02-09 21:45:15 UTC (rev 18754)
@@ -1,5 +1,7 @@
package org.hibernate.test.keymanytoone.bidir.embedded;
+import java.util.List;
+
import junit.framework.Test;
import org.hibernate.Session;
@@ -45,6 +47,32 @@
s.close();
}
+ public void testQueryingOnMany2One() {
+ Session s = openSession();
+ s.beginTransaction();
+ Customer cust = new Customer( "Acme, Inc." );
+ Order order = new Order( cust, 1 );
+ cust.getOrders().add( order );
+ s.save( cust );
+ s.getTransaction().commit();
+ s.close();
+
+ s = openSession();
+ s.beginTransaction();
+ List results = s.createQuery( "from Order o where o.customer.name = :name" )
+ .setParameter( "name", cust.getName() )
+ .list();
+ assertEquals( 1, results.size() );
+ s.getTransaction().commit();
+ s.close();
+
+ s = openSession();
+ s.beginTransaction();
+ s.delete( cust );
+ s.getTransaction().commit();
+ s.close();
+ }
+
public void testLoadingStrategies() {
Session s = openSession();
s.beginTransaction();
16 years, 2 months
Hibernate SVN: r18753 - in jpamodelgen/trunk/src: main/java/org/hibernate/jpamodelgen/annotation and 4 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-02-09 16:29:34 -0500 (Tue, 09 Feb 2010)
New Revision: 18753
Added:
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCompany.java
jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/rentalcar.xml
Removed:
jpamodelgen/trunk/src/test/java/test/
Modified:
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
Log:
METAGEN-9 First completed cut. Needs more testing
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java 2010-02-09 20:23:31 UTC (rev 18752)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java 2010-02-09 21:29:34 UTC (rev 18753)
@@ -17,6 +17,7 @@
*/
package org.hibernate.jpamodelgen;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
@@ -104,8 +105,10 @@
Set<? extends Element> elements = roundEnvironment.getRootElements();
for ( Element element : elements ) {
- context.logMessage( Diagnostic.Kind.OTHER, "Processing " + element.toString() );
- handleRootElementAnnotationMirrors( element );
+ if ( TypeUtils.containsAnnotation( element, Entity.class, MappedSuperclass.class, Embeddable.class ) ) {
+ context.logMessage( Diagnostic.Kind.OTHER, "Processing " + element.toString() );
+ handleRootElementAnnotationMirrors( element );
+ }
}
return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
@@ -123,7 +126,7 @@
}
}
- private boolean hostJPAAnnotations(Set<? extends TypeElement> annotations) {
+ private boolean hostJPAAnnotations(Collection<? extends TypeElement> annotations) {
for ( TypeElement type : annotations ) {
if ( TypeUtils.isTypeElementOfType( type, Entity.class ) ) {
return true;
@@ -151,6 +154,9 @@
}
AnnotationMetaEntity metaEntity = new AnnotationMetaEntity( ( TypeElement ) element, context );
+ if ( alreadyExistingMetaEntity != null ) {
+ metaEntity.mergeInMembers( alreadyExistingMetaEntity.getMembers() );
+ }
addMetaEntityToContext( mirror, metaEntity );
}
}
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java 2010-02-09 20:23:31 UTC (rev 18752)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java 2010-02-09 21:29:34 UTC (rev 18753)
@@ -18,6 +18,7 @@
package org.hibernate.jpamodelgen.annotation;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -38,6 +39,7 @@
import javax.lang.model.util.Elements;
import javax.lang.model.util.SimpleTypeVisitor6;
import javax.persistence.AccessType;
+import javax.persistence.Basic;
import javax.persistence.ElementCollection;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
@@ -73,10 +75,38 @@
COLLECTIONS.put( "java.util.Map", "javax.persistence.metamodel.MapAttribute" );
}
+ static List<String> BASIC_TYPES = new ArrayList<String>();
+
+ static {
+ BASIC_TYPES.add( "java.lang.String" );
+ BASIC_TYPES.add( "java.lang.Boolean" );
+ BASIC_TYPES.add( "java.lang.Byte" );
+ BASIC_TYPES.add( "java.lang.Character" );
+ BASIC_TYPES.add( "java.lang.Short" );
+ BASIC_TYPES.add( "java.lang.Integer" );
+ BASIC_TYPES.add( "java.lang.Long" );
+ BASIC_TYPES.add( "java.lang.Float" );
+ BASIC_TYPES.add( "java.lang.Double" );
+ BASIC_TYPES.add( "java.math.BigInteger" );
+ BASIC_TYPES.add( "java.math.BigDecimal" );
+ BASIC_TYPES.add( "java.util.Date" );
+ BASIC_TYPES.add( "java.util.Calendar" );
+ BASIC_TYPES.add( "java.sql.Date" );
+ BASIC_TYPES.add( "java.sql.Time" );
+ BASIC_TYPES.add( "java.sql.Timestamp" );
+ }
+
+ static List<String> BASIC_ARRAY_TYPES = new ArrayList<String>();
+
+ static {
+ BASIC_ARRAY_TYPES.add( "java.lang.Character" );
+ BASIC_ARRAY_TYPES.add( "java.lang.Byte" );
+ }
+
private final TypeElement element;
private final ImportContext importContext;
private Context context;
- private List<MetaAttribute> members;
+ private Map<String, MetaAttribute> members;
private AccessTypeInformation entityAccessTypeInfo;
public AnnotationMetaEntity(TypeElement element, Context context) {
@@ -104,7 +134,7 @@
}
public List<MetaAttribute> getMembers() {
- return members;
+ return new ArrayList<MetaAttribute>( members.values() );
}
@Override
@@ -112,6 +142,12 @@
return false;
}
+ public void mergeInMembers(Collection<MetaAttribute> attributes) {
+ for ( MetaAttribute attribute : attributes ) {
+ members.put( attribute.getPropertyName(), attribute );
+ }
+ }
+
private void addPersistentMembers(List<? extends Element> membersOfClass, AccessType membersKind) {
for ( Element memberOfClass : membersOfClass ) {
AccessType forcedAccessType = TypeUtils.determineAnnotationSpecifiedAccessType( memberOfClass );
@@ -128,7 +164,7 @@
TypeVisitor visitor = new TypeVisitor( this );
AnnotationMetaAttribute result = memberOfClass.asType().accept( visitor, memberOfClass );
if ( result != null ) {
- members.add( result );
+ members.put( result.getPropertyName(), result );
}
}
}
@@ -144,7 +180,7 @@
}
private void init() {
- members = new ArrayList<MetaAttribute>();
+ members = new HashMap<String, MetaAttribute>();
TypeUtils.determineAccessTypeForHierarchy( element, context );
entityAccessTypeInfo = context.getAccessTypeInfo( getQualifiedName() );
@@ -183,17 +219,29 @@
}
@Override
- protected AnnotationMetaAttribute defaultAction(TypeMirror e, Element p) {
- return super.defaultAction( e, p );
- }
-
- @Override
public AnnotationMetaAttribute visitPrimitive(PrimitiveType t, Element element) {
return new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
}
@Override
public AnnotationMetaAttribute visitArray(ArrayType t, Element element) {
+ // METAGEN-2 - For now we handle arrays as SingularAttribute
+ // The code below is an attempt to be closer to the spec and only allow byte[], Byte[], char[] and Character[]
+// AnnotationMetaSingleAttribute attribute = null;
+// TypeMirror componentMirror = t.getComponentType();
+// if ( TypeKind.CHAR.equals( componentMirror.getKind() )
+// || TypeKind.BYTE.equals( componentMirror.getKind() ) ) {
+// attribute = new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
+// }
+// else if ( TypeKind.DECLARED.equals( componentMirror.getKind() ) ) {
+// TypeElement componentElement = ( TypeElement ) context.getProcessingEnvironment()
+// .getTypeUtils()
+// .asElement( componentMirror );
+// if ( BASIC_ARRAY_TYPES.contains( componentElement.getQualifiedName().toString() ) ) {
+// attribute = new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
+// }
+// }
+// return attribute;
return new AnnotationMetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
}
@@ -245,9 +293,14 @@
}
}
else {
- return new AnnotationMetaSingleAttribute(
- parent, element, returnedElement.getQualifiedName().toString()
- );
+ if ( isBasicAttribute( element, returnedElement ) ) {
+ return new AnnotationMetaSingleAttribute(
+ parent, element, returnedElement.getQualifiedName().toString()
+ );
+ }
+ else {
+ return null;
+ }
}
}
@@ -258,15 +311,25 @@
}
String string = p.getSimpleName().toString();
- if ( StringUtil.isPropertyName( string ) ) {
- TypeMirror returnType = t.getReturnType();
- return returnType.accept( this, p );
- }
- else {
+ if ( !StringUtil.isPropertyName( string ) ) {
return null;
}
+
+ TypeMirror returnType = t.getReturnType();
+ return returnType.accept( this, p );
}
+ private boolean isBasicAttribute(Element element, Element returnedElement) {
+ if ( TypeUtils.containsAnnotation( element, Basic.class )
+ || TypeUtils.containsAnnotation( element, OneToOne.class )
+ || TypeUtils.containsAnnotation( element, ManyToOne.class ) ) {
+ return true;
+ }
+
+ BasicAttributeVisitor basicVisitor = new BasicAttributeVisitor();
+ return returnedElement.asType().accept( basicVisitor, returnedElement );
+ }
+
private AnnotationMetaAttribute createAnnotationMetaAttributeForMap(DeclaredType declaredType, Element element, String collection, String targetEntity) {
String keyType;
if ( TypeUtils.containsAnnotation( element, MapKeyClass.class ) ) {
@@ -336,7 +399,11 @@
}
private String getKeyType(DeclaredType t) {
- return TypeUtils.extractClosestRealTypeAsString( t.getTypeArguments().get( 0 ), context );
+ List<? extends TypeMirror> typeArguments = t.getTypeArguments();
+ if ( typeArguments.size() == 0 ) {
+ context.logMessage( Diagnostic.Kind.ERROR, "Entity: " + getQualifiedName() );
+ }
+ return TypeUtils.extractClosestRealTypeAsString( typeArguments.get( 0 ), context );
}
/**
@@ -376,4 +443,49 @@
return targetEntityName;
}
}
+
+ /**
+ * Checks whether the visited type is a basic attibute according to the JPA 2 spec
+ * ( secction 2.8 Mapping Defaults for Non-Relationship Fields or Properties)
+ */
+ class BasicAttributeVisitor extends SimpleTypeVisitor6<Boolean, Element> {
+ @Override
+ public Boolean visitPrimitive(PrimitiveType t, Element element) {
+ return Boolean.TRUE;
+ }
+
+ @Override
+ public Boolean visitArray(ArrayType t, Element element) {
+ TypeMirror componentMirror = t.getComponentType();
+ TypeElement componentElement = ( TypeElement ) context.getProcessingEnvironment()
+ .getTypeUtils()
+ .asElement( componentMirror );
+
+ return BASIC_ARRAY_TYPES.contains( componentElement.getQualifiedName().toString() );
+ }
+
+ @Override
+ public Boolean visitDeclared(DeclaredType declaredType, Element element) {
+ if ( ElementKind.ENUM.equals( element.getKind() ) ) {
+ return Boolean.TRUE;
+ }
+
+ if ( ElementKind.CLASS.equals( element.getKind() ) ) {
+ TypeElement typeElement = ( ( TypeElement ) element );
+ String typeName = typeElement.getQualifiedName().toString();
+ if ( BASIC_TYPES.contains( typeName ) ) {
+ return Boolean.TRUE;
+ }
+ for ( TypeMirror mirror : typeElement.getInterfaces() ) {
+ TypeElement interfaceElement = ( TypeElement ) context.getProcessingEnvironment()
+ .getTypeUtils()
+ .asElement( mirror );
+ if ( "java.io.Serializable".equals( interfaceElement.getQualifiedName().toString() ) ) {
+ return Boolean.TRUE;
+ }
+ }
+ }
+ return Boolean.FALSE;
+ }
+ }
}
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java 2010-02-09 20:23:31 UTC (rev 18752)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java 2010-02-09 21:29:34 UTC (rev 18753)
@@ -18,6 +18,7 @@
package org.hibernate.jpamodelgen.xml;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -162,7 +163,7 @@
public TypeElement getTypeElement() {
return element;
}
-
+
@Override
public boolean isMetaComplete() {
return isMetaComplete;
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java 2010-02-09 20:23:31 UTC (rev 18752)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java 2010-02-09 21:29:34 UTC (rev 18753)
@@ -46,10 +46,19 @@
assertMetamodelClassGeneratedFor( Vehicle.class );
assertMetamodelClassGeneratedFor( Truck.class );
assertPresenceOfFieldInMetamodelFor(
- Truck.class, "horsePower", "Property horsePower has explicit access type and should be in metamodel"
+ Truck.class, "horsePower", "Property 'horsePower' has explicit access type and should be in metamodel"
);
}
+ @Test
+ public void testMixedConfiguration() {
+ assertMetamodelClassGeneratedFor( RentalCar.class );
+ assertMetamodelClassGeneratedFor( RentalCompany.class );
+ assertPresenceOfFieldInMetamodelFor(
+ RentalCar.class, "company", "Property 'company' should be included due to xml configuration"
+ );
+ }
+
@Override
protected String getPackageNameOfTestSources() {
return MixedConfigurationTest.class.getPackage().getName();
@@ -58,8 +67,10 @@
@Override
protected Collection<String> getOrmFiles() {
List<String> ormFiles = new ArrayList<String>();
- ormFiles.add( TestUtil.fcnToPath( MixedConfigurationTest.class.getPackage().getName() ) + "/car.xml" );
- ormFiles.add( TestUtil.fcnToPath( MixedConfigurationTest.class.getPackage().getName() ) + "/truck.xml" );
+ String dir = TestUtil.fcnToPath( MixedConfigurationTest.class.getPackage().getName() );
+ ormFiles.add( dir + "/car.xml" );
+ ormFiles.add( dir + "/rentalcar.xml" );
+ ormFiles.add( dir + "/truck.xml" );
return ormFiles;
}
}
\ No newline at end of file
Copied: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java (from rev 18734, jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java)
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java 2010-02-09 21:29:34 UTC (rev 18753)
@@ -0,0 +1,61 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+import javax.persistence.Entity;
+
+
+/**
+ * @author Hardy Ferentschik
+ */
+@Entity
+public class RentalCar extends Car {
+ private RentalCompany company;
+
+ private CURRENTLY_HIRED hired;
+
+ private Character[] chassisNumber;
+
+ public RentalCompany getCompany() {
+ return company;
+ }
+
+ public void setCompany(RentalCompany company) {
+ this.company = company;
+ }
+
+ public Character[] getChassisNumber() {
+ return chassisNumber;
+ }
+
+ public void setChassisNumber(Character[] chassisNumber) {
+ this.chassisNumber = chassisNumber;
+ }
+
+ public CURRENTLY_HIRED getHired() {
+ return hired;
+ }
+
+ public void setHired(CURRENTLY_HIRED hired) {
+ this.hired = hired;
+ }
+
+ enum CURRENTLY_HIRED {
+ YES, NO
+ }
+}
\ No newline at end of file
Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCompany.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCompany.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCompany.java 2010-02-09 21:29:34 UTC (rev 18753)
@@ -0,0 +1,50 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.mixedmode;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Hardy Ferentschik
+ */
+@Entity
+public class RentalCompany {
+ @Id
+ @GeneratedValue
+ 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;
+ }
+}
\ No newline at end of file
Copied: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/rentalcar.xml (from rev 18734, jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/car.xml)
===================================================================
--- jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/rentalcar.xml (rev 0)
+++ jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/rentalcar.xml 2010-02-09 21:29:34 UTC (rev 18753)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
+ version="2.0"
+ >
+ <!-- foo.bar should get ignored since class is fully qualified -->
+ <package>foo.bar</package>
+ <entity class="org.hibernate.jpamodelgen.test.mixedmode.RentalCar">
+ <attributes>
+ <many-to-one name="company" access="FIELD"/>
+ </attributes>
+ </entity>
+</entity-mappings>
+
Property changes on: jpamodelgen/trunk/src/test/resources/org/hibernate/jpamodelgen/test/mixedmode/rentalcar.xml
___________________________________________________________________
Name: svn:keywords
+ Id
16 years, 2 months
Hibernate SVN: r18752 - core/branches/Branch_3_3_2_GA_CP/cache-jbosscache2.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-02-09 15:23:31 -0500 (Tue, 09 Feb 2010)
New Revision: 18752
Modified:
core/branches/Branch_3_3_2_GA_CP/cache-jbosscache2/pom.xml
Log:
clean up pom.xml, no code changed
Modified: core/branches/Branch_3_3_2_GA_CP/cache-jbosscache2/pom.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/cache-jbosscache2/pom.xml 2010-02-09 20:19:02 UTC (rev 18751)
+++ core/branches/Branch_3_3_2_GA_CP/cache-jbosscache2/pom.xml 2010-02-09 20:23:31 UTC (rev 18752)
@@ -35,12 +35,6 @@
<version>${version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>hsqldb</groupId>
- <artifactId>hsqldb</artifactId>
- <version>1.8.0.2</version>
- <scope>test</scope>
- </dependency>
<!-- this is optional on core :( and needed for testing -->
<dependency>
<groupId>cglib</groupId>
@@ -55,31 +49,9 @@
</dependencies>
<build>
- <testResources>
- <testResource>
- <filtering>false</filtering>
- <directory>src/test/java</directory>
- <includes>
- <include>**/*.xml</include>
- </includes>
- </testResource>
- <testResource>
- <filtering>true</filtering>
- <directory>src/test/resources</directory>
- </testResource>
- </testResources>
-
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.5</source>
- <target>1.5</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
@@ -88,10 +60,6 @@
</excludes>
<systemProperties>
<property>
- <name>hibernate.test.validatefailureexpected</name>
- <value>true</value>
- </property>
- <property>
<name>jgroups.bind_addr</name>
<value>${jgroups.bind_addr}</value>
</property>
16 years, 2 months
Hibernate SVN: r18751 - core/branches/Branch_3_3_2_GA_CP/cache-jbosscache.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-02-09 15:19:02 -0500 (Tue, 09 Feb 2010)
New Revision: 18751
Modified:
core/branches/Branch_3_3_2_GA_CP/cache-jbosscache/pom.xml
Log:
clean up pom.xml, no code changed
Modified: core/branches/Branch_3_3_2_GA_CP/cache-jbosscache/pom.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/cache-jbosscache/pom.xml 2010-02-09 20:15:57 UTC (rev 18750)
+++ core/branches/Branch_3_3_2_GA_CP/cache-jbosscache/pom.xml 2010-02-09 20:19:02 UTC (rev 18751)
@@ -66,12 +66,6 @@
<version>${version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>hsqldb</groupId>
- <artifactId>hsqldb</artifactId>
- <version>1.8.0.2</version>
- <scope>test</scope>
- </dependency>
<!-- these are optional on core... :( -->
<dependency>
<groupId>javassist</groupId>
16 years, 2 months
Hibernate SVN: r18750 - core/branches/Branch_3_3_2_GA_CP/cache-ehcache.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-02-09 15:15:57 -0500 (Tue, 09 Feb 2010)
New Revision: 18750
Modified:
core/branches/Branch_3_3_2_GA_CP/cache-ehcache/pom.xml
Log:
clean up pom.xml, no code changed
Modified: core/branches/Branch_3_3_2_GA_CP/cache-ehcache/pom.xml
===================================================================
--- core/branches/Branch_3_3_2_GA_CP/cache-ehcache/pom.xml 2010-02-09 19:55:48 UTC (rev 18749)
+++ core/branches/Branch_3_3_2_GA_CP/cache-ehcache/pom.xml 2010-02-09 20:15:57 UTC (rev 18750)
@@ -35,12 +35,6 @@
<version>${version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>hsqldb</groupId>
- <artifactId>hsqldb</artifactId>
- <version>1.8.0.2</version>
- <scope>test</scope>
- </dependency>
<!-- these are optional on core... :( -->
<dependency>
<groupId>cglib</groupId>
16 years, 2 months