📄 collectiontype.java
字号:
*/ public abstract PersistentCollection wrap(SessionImplementor session, Object collection); /** * Note: return true because this type is castable to <tt>AssociationType</tt>. Not because * all collections are associations. */ public boolean isAssociationType() { return true; } public ForeignKeyDirection getForeignKeyDirection() { return ForeignKeyDirection.FOREIGN_KEY_TO_PARENT; } /** * Get the key value from the owning entity instance, usually the identifier, but might be some * other unique key, in the case of property-ref */ public Serializable getKeyOfOwner(Object owner, SessionImplementor session) { EntityEntry e = session.getPersistenceContext().getEntry( owner ); if ( e == null ) return null; // This just handles a particular case of component // projection, perhaps get rid of it and throw an exception if ( foreignKeyPropertyName == null ) { return e.getId(); } else { // TODO: at the point where we are resolving collection references, we don't // know if the uk value has been resolved (depends if it was earlier or // later in the mapping document) - now, we could try and use e.getStatus() // to decide to semiResolve(), trouble is that initializeEntity() reuses // the same array for resolved and hydrated values Object id = e.getLoadedValue( foreignKeyPropertyName ); // NOTE VERY HACKISH WORKAROUND!! Type keyType = getPersister( session ).getKeyType(); if ( !keyType.getReturnedClass().isInstance( id ) ) { id = (Serializable) keyType.semiResolve( e.getLoadedValue( foreignKeyPropertyName ), session, owner ); } return (Serializable) id; } } public Object hydrate(ResultSet rs, String[] name, SessionImplementor session, Object owner) { // can't just return null here, since that would // cause an owning component to become null return NOT_NULL_COLLECTION; } public Object resolve(Object value, SessionImplementor session, Object owner) throws HibernateException { return resolveKey( getKeyOfOwner( owner, session ), session, owner ); } private Object resolveKey(Serializable key, SessionImplementor session, Object owner) { // if (key==null) throw new AssertionFailure("owner identifier unknown when re-assembling // collection reference"); return key == null ? null : // TODO: can this case really occur?? getCollection( key, session, owner ); } public Object semiResolve(Object value, SessionImplementor session, Object owner) throws HibernateException { throw new UnsupportedOperationException( "collection mappings may not form part of a property-ref" ); } public boolean isArrayType() { return false; } public boolean useLHSPrimaryKey() { return foreignKeyPropertyName == null; } public String getRHSUniqueKeyPropertyName() { return null; } public Joinable getAssociatedJoinable(SessionFactoryImplementor factory) throws MappingException { return (Joinable) factory.getCollectionPersister( role ); } public boolean isModified(Object old, Object current, SessionImplementor session) throws HibernateException { return false; } public String getAssociatedEntityName(SessionFactoryImplementor factory) throws MappingException { try { QueryableCollection collectionPersister = (QueryableCollection) factory .getCollectionPersister( role ); if ( !collectionPersister.getElementType().isEntityType() ) { throw new MappingException( "collection was not an association: " + collectionPersister.getRole() ); } return collectionPersister.getElementPersister().getEntityName(); } catch (ClassCastException cce) { throw new MappingException( "collection role is not queryable " + role ); } } /** * Replace the elements of a collection with the elements of another collection */ public Object replaceElements(Object original, Object target, Object owner, Map copyCache, SessionImplementor session) throws HibernateException { // TODO: does not work for EntityMode.DOM4J yet! java.util.Collection result = (java.util.Collection) target; result.clear(); // copy elements into newly empty target collection Type elemType = getElementType( session.getFactory() ); Iterator iter = ( (java.util.Collection) original ).iterator(); while ( iter.hasNext() ) { result.add( elemType.replace( iter.next(), null, session, owner, copyCache ) ); } return result; } /** * Instantiate an empty instance of the "underlying" collection (not a wrapper) */ public abstract Object instantiate(Object original); public Object replace(final Object original, final Object target, final SessionImplementor session, final Object owner, final Map copyCache) throws HibernateException { if ( original == null ) return null; if ( !Hibernate.isInitialized( original ) ) return target; if ( original == target ) return target; // is this really a Good Thing? Object result = target == null ? instantiate( original ) : target; return replaceElements( original, result, owner, copyCache, session ); } /** * Get the Hibernate type of the collection elements */ public final Type getElementType(SessionFactoryImplementor factory) throws MappingException { return factory.getCollectionPersister( getRole() ).getElementType(); } public String toString() { return getClass().getName() + '(' + getRole() + ')'; } public String getOnCondition(String alias, SessionFactoryImplementor factory, Map enabledFilters) throws MappingException { return getAssociatedJoinable( factory ).filterFragment( alias, enabledFilters ); } /** * instantiate a collection wrapper (called when loading an object) */ public Object getCollection(Serializable key, SessionImplementor session, Object owner) throws HibernateException { CollectionPersister persister = getPersister( session ); final PersistenceContext persistenceContext = session.getPersistenceContext(); final EntityMode entityMode = session.getEntityMode(); if (entityMode==EntityMode.DOM4J && !isEmbeddedInXML) { return UNFETCHED_COLLECTION; } // check if collection is currently being loaded PersistentCollection collection = persistenceContext .getCollectionLoadContext() .getLoadingCollection( persister, key, entityMode ); if ( collection == null ) { // check if it is already completely loaded, but unowned collection = persistenceContext.useUnownedCollection( new CollectionKey(persister, key, entityMode) ); if (collection==null) { // create a new collection wrapper, to be initialized later collection = instantiate( session, persister, key ); collection.setOwner(owner); persistenceContext.addUninitializedCollection( collection, persister, key, entityMode ); // some collections are not lazy: if ( initializeImmediately( entityMode ) ) { session.initializeCollection( collection, false ); } else if ( !persister.isLazy() ) { persistenceContext.addNonLazyCollection( collection ); } if ( hasHolder( entityMode ) ) { session.getPersistenceContext().addCollectionHolder( collection ); } } } collection.setOwner(owner); return collection.getValue(); } public boolean hasHolder(EntityMode entityMode) { return entityMode == EntityMode.DOM4J; } protected boolean initializeImmediately(EntityMode entityMode) { return entityMode == EntityMode.DOM4J; } public String getLHSPropertyName() { return foreignKeyPropertyName; } public boolean isXMLElement() { return true; } public Object fromXMLNode(Node xml, Mapping factory) throws HibernateException { return xml; } public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) throws HibernateException { if ( !isEmbeddedInXML ) { node.detach(); } else { replaceNode( node, (Element) value ); } } public boolean isAlwaysDirtyChecked() { return true; // because we sometimes need to incremement version number of owner // and also because of how assemble/disassemble is implemented for uks }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -