HHH-4202 - Implement JPA 2.0 metamodel APIs

git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@17843 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
Steve Ebersole 2009-10-26 17:04:59 +00:00
parent 9fb2cb6d15
commit d74037756e
28 changed files with 600 additions and 184 deletions

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,12 +20,12 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.engine.SessionFactoryImplementor;
@ -140,6 +140,13 @@ public class BackrefPropertyAccessor implements PropertyAccessor {
}
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return null;
}
/**
* {@inheritDoc}
*/

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,13 +20,13 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.beans.Introspector;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.slf4j.Logger;
@ -164,6 +164,9 @@ public class BasicPropertyAccessor implements PropertyAccessor {
this.propertyName=propertyName;
}
/**
* {@inheritDoc}
*/
public Object get(Object target) throws HibernateException {
try {
return method.invoke(target, null);
@ -202,18 +205,37 @@ public class BasicPropertyAccessor implements PropertyAccessor {
}
}
/**
* {@inheritDoc}
*/
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
/**
* {@inheritDoc}
*/
public Class getReturnType() {
return method.getReturnType();
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return method;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return method;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return method.getName();
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,12 +20,12 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@ -50,6 +50,10 @@ public class DirectPropertyAccessor implements PropertyAccessor {
this.clazz = clazz;
this.name = name;
}
/**
* {@inheritDoc}
*/
public Object get(Object target) throws HibernateException {
try {
return field.get(target);
@ -59,16 +63,37 @@ public class DirectPropertyAccessor implements PropertyAccessor {
}
}
/**
* {@inheritDoc}
*/
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return field;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public Class getReturnType() {
return field.getType();
}
@ -91,12 +116,24 @@ public class DirectPropertyAccessor implements PropertyAccessor {
this.clazz = clazz;
this.name = name;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {
try {
field.set(target, value);

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.dom4j.Attribute;
@ -53,7 +53,6 @@ public class Dom4jAccessor implements PropertyAccessor {
this.factory = factory;
this.nodeName = nodeName;
this.propertyType = propertyType;
}
/**
@ -118,21 +117,28 @@ public class Dom4jAccessor implements PropertyAccessor {
}
/**
* Get the declared Java type
* {@inheritDoc}
*/
public Class getReturnType() {
return Object.class;
}
/**
* Optional operation (return null)
* {@inheritDoc}
*/
public Member getMember() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* Optional operation (return null)
* {@inheritDoc}
*/
public Method getMethod() {
return null;
@ -147,14 +153,14 @@ public class Dom4jAccessor implements PropertyAccessor {
}
/**
* Optional operation (return null)
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* Optional operation (return null)
* {@inheritDoc}
*/
public Method getMethod() {
return null;
@ -166,16 +172,17 @@ public class Dom4jAccessor implements PropertyAccessor {
* @author Gavin King
*/
public static class TextGetter extends Dom4jGetter {
TextGetter(Type propertyType, SessionFactoryImplementor factory) {
super(propertyType, factory);
}
/**
* {@inheritDoc}
*/
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
return super.propertyType.fromXMLNode(ownerElement, super.factory);
}
}
/**
@ -184,19 +191,21 @@ public class Dom4jAccessor implements PropertyAccessor {
*/
public static class AttributeGetter extends Dom4jGetter {
private final String attributeName;
AttributeGetter(String name, Type propertyType, SessionFactoryImplementor factory) {
super(propertyType, factory);
attributeName = name.substring(1);
}
/**
* {@inheritDoc}
*/
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
Node attribute = ownerElement.attribute(attributeName);
return attribute==null ? null :
super.propertyType.fromXMLNode(attribute, super.factory);
}
}
/**
@ -211,13 +220,15 @@ public class Dom4jAccessor implements PropertyAccessor {
elementName = name;
}
/**
* {@inheritDoc}
*/
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
Node element = ownerElement.element(elementName);
return element==null ?
null : super.propertyType.fromXMLNode(element, super.factory);
}
}
/**
@ -227,13 +238,16 @@ public class Dom4jAccessor implements PropertyAccessor {
public static class ElementAttributeGetter extends Dom4jGetter {
private final String elementName;
private final String attributeName;
ElementAttributeGetter(String name, Type propertyType, SessionFactoryImplementor factory) {
super(propertyType, factory);
elementName = name.substring( 0, name.indexOf('/') );
attributeName = name.substring( name.indexOf('/')+2 );
}
/**
* {@inheritDoc}
*/
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
@ -260,12 +274,14 @@ public class Dom4jAccessor implements PropertyAccessor {
* @author Gavin King
*/
public static class TextSetter extends Dom4jSetter {
TextSetter(Type propertyType) {
super(propertyType);
}
public void set(Object target, Object value, SessionFactoryImplementor factory)
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
Element owner = ( Element ) target;
if ( !super.propertyType.isXMLElement() ) { //kinda ugly, but needed for collections with a "." node mapping
@ -277,7 +293,6 @@ public class Dom4jAccessor implements PropertyAccessor {
}
}
}
}
/**
@ -286,13 +301,16 @@ public class Dom4jAccessor implements PropertyAccessor {
*/
public static class AttributeSetter extends Dom4jSetter {
private final String attributeName;
AttributeSetter(String name, Type propertyType) {
super(propertyType);
attributeName = name.substring(1);
}
public void set(Object target, Object value, SessionFactoryImplementor factory)
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
Element owner = ( Element ) target;
Attribute attribute = owner.attribute(attributeName);
@ -307,7 +325,6 @@ public class Dom4jAccessor implements PropertyAccessor {
super.propertyType.setToXMLNode(attribute, value, factory);
}
}
}
/**
@ -322,7 +339,10 @@ public class Dom4jAccessor implements PropertyAccessor {
elementName = name;
}
public void set(Object target, Object value, SessionFactoryImplementor factory)
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
if (value!=CollectionType.UNFETCHED_COLLECTION) {
Element owner = ( Element ) target;
@ -334,7 +354,6 @@ public class Dom4jAccessor implements PropertyAccessor {
}
}
}
}
/**
@ -351,7 +370,10 @@ public class Dom4jAccessor implements PropertyAccessor {
attributeName = name.substring( name.indexOf('/')+2 );
}
public void set(Object target, Object value, SessionFactoryImplementor factory)
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
Element owner = ( Element ) target;
Element element = owner.element(elementName);
@ -375,7 +397,6 @@ public class Dom4jAccessor implements PropertyAccessor {
super.propertyType.setToXMLNode(attribute, value, factory);
}
}
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@ -38,29 +38,50 @@ import org.hibernate.engine.SessionFactoryImplementor;
public class EmbeddedPropertyAccessor implements PropertyAccessor {
public static final class EmbeddedGetter implements Getter {
private final Class clazz;
EmbeddedGetter(Class clazz) {
this.clazz = clazz;
}
/**
* {@inheritDoc}
*/
public Object get(Object target) throws HibernateException {
return target;
}
/**
* {@inheritDoc}
*/
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return null;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public Class getReturnType() {
return clazz;
}
@ -71,23 +92,35 @@ public class EmbeddedPropertyAccessor implements PropertyAccessor {
}
public static final class EmbeddedSetter implements Setter {
private final Class clazz;
EmbeddedSetter(Class clazz) {
this.clazz = clazz;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {}
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory) {
}
/**
* {@inheritDoc}
*/
public String toString() {
return "EmbeddedSetter(" + clazz.getName() + ')';
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,12 +20,12 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@ -58,17 +58,35 @@ public interface Getter extends Serializable {
throws HibernateException;
/**
* Get the declared Java type
* Retrieve the member to which this property maps. This might be the
* field or it might be the getter method.
*
* @return The mapped member.
*/
public Member getMember();
/**
* Retrieve the declared Java type
*
* @return The declared java type.
*/
public Class getReturnType();
/**
* Retrieve the getter-method name.
* <p/>
* Optional operation (return null)
*
* @return The name of the getter method, or null.
*/
public String getMethodName();
/**
* Retrieve the getter-method.
* <p/>
* Optional operation (return null)
*
* @return The getter method, or null.
*/
public Method getMethod();
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@ -37,7 +37,6 @@ import org.hibernate.engine.SessionFactoryImplementor;
* @author Gavin King
*/
public class IndexPropertyAccessor implements PropertyAccessor {
private final String propertyName;
private final String entityName;
@ -45,6 +44,7 @@ public class IndexPropertyAccessor implements PropertyAccessor {
* Constructs a new instance of IndexPropertyAccessor.
*
* @param collectionRole The collection role which this back ref references.
* @param entityName The name of the entity owning the collection.
*/
public IndexPropertyAccessor(String collectionRole, String entityName) {
this.propertyName = collectionRole.substring( entityName.length()+1 );
@ -64,20 +64,24 @@ public class IndexPropertyAccessor implements PropertyAccessor {
* The Setter implementation for index backrefs.
*/
public static final class IndexSetter implements Setter {
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
public void set(Object target, Object value) {
// do nothing...
}
public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException {
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory) {
// do nothing...
}
@ -88,7 +92,6 @@ public class IndexPropertyAccessor implements PropertyAccessor {
* The Getter implementation for index backrefs.
*/
public class IndexGetter implements Getter {
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) throws HibernateException {
if (session==null) {
return BackrefPropertyAccessor.UNKNOWN;
@ -99,18 +102,37 @@ public class IndexPropertyAccessor implements PropertyAccessor {
}
}
/**
* {@inheritDoc}
*/
public Object get(Object target) {
return BackrefPropertyAccessor.UNKNOWN;
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return null;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public Class getReturnType() {
return Object.class;
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@ -36,33 +36,46 @@ import org.hibernate.engine.SessionImplementor;
* @author Gavin King
*/
public class MapAccessor implements PropertyAccessor {
/**
* {@inheritDoc}
*/
public Getter getGetter(Class theClass, String propertyName)
throws PropertyNotFoundException {
return new MapGetter(propertyName);
}
/**
* {@inheritDoc}
*/
public Setter getSetter(Class theClass, String propertyName)
throws PropertyNotFoundException {
return new MapSetter(propertyName);
}
public static final class MapSetter implements Setter {
private String name;
MapSetter(String name) {
this.name = name;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
( (Map) target ).put(name, value);
@ -71,33 +84,53 @@ public class MapAccessor implements PropertyAccessor {
}
public static final class MapGetter implements Getter {
private String name;
MapGetter(String name) {
this.name = name;
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return null;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public Object get(Object target) throws HibernateException {
return ( (Map) target ).get(name);
}
/**
* {@inheritDoc}
*/
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
/**
* {@inheritDoc}
*/
public Class getReturnType() {
return Object.class;
}
}
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@ -38,11 +38,16 @@ import org.hibernate.engine.SessionImplementor;
* @author Michael Bartmann
*/
public class NoopAccessor implements PropertyAccessor {
/**
* {@inheritDoc}
*/
public Getter getGetter(Class arg0, String arg1) throws PropertyNotFoundException {
return new NoopGetter();
}
/**
* {@inheritDoc}
*/
public Setter getSetter(Class arg0, String arg1) throws PropertyNotFoundException {
return new NoopSetter();
}
@ -51,47 +56,73 @@ public class NoopAccessor implements PropertyAccessor {
* A Getter which will always return null. It should not be called anyway.
*/
private static class NoopGetter implements Getter {
/**
* @return always null
* {@inheritDoc}
* <p/>
* Here we always return <tt>null</tt>
*/
public Object get(Object target) throws HibernateException {
return null;
}
/**
* {@inheritDoc}
*/
public Object getForInsert(Object target, Map map, SessionImplementor arg1)
throws HibernateException {
return null;
}
/**
* {@inheritDoc}
*/
public Class getReturnType() {
return Object.class;
}
/**
* {@inheritDoc}
*/
public Member getMember() {
return null;
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}
}
/**
* A Setter which will just do nothing.
*/
private static class NoopSetter implements Setter {
public void set(Object target, Object value, SessionFactoryImplementor arg2)
throws HibernateException {
// do not do anything
/**
* {@inheritDoc}
*/
public void set(Object target, Object value, SessionFactoryImplementor arg2) {
// nothing to do
}
/**
* {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
* {@inheritDoc}
*/
public Method getMethod() {
return null;
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;
@ -29,15 +28,31 @@ import org.hibernate.PropertyNotFoundException;
/**
* Abstracts the notion of a "property". Defines a strategy for accessing the
* value of an attribute.
*
* @author Gavin King
*/
public interface PropertyAccessor {
/**
* Create a "getter" for the named attribute
*
* @param theClass The class on which the property is defined.
* @param propertyName The name of the property.
*
* @return An appropriate getter.
*
* @throws PropertyNotFoundException Indicates a problem interpretting the propertyName
*/
public Getter getGetter(Class theClass, String propertyName) throws PropertyNotFoundException;
/**
* Create a "setter" for the named attribute
*
* @param theClass The class on which the property is defined.
* @param propertyName The name of the property.
*
* @return An appropriate setter
*
* @throws PropertyNotFoundException Indicates a problem interpretting the propertyName
*/
public Setter getSetter(Class theClass, String propertyName) throws PropertyNotFoundException;
}

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;

View File

@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @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
@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.property;

View File

@ -1,10 +1,10 @@
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
~ Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
~ third-party contributors as indicated by either @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
@ -20,7 +20,6 @@
~ Free Software Foundation, Inc.
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
~
-->
<html>

View File

@ -25,6 +25,7 @@
package org.hibernate.tuple;
import org.hibernate.HibernateException;
import org.hibernate.property.Getter;
/**
* A tuplizer defines the contract for things which know how to manage
@ -56,24 +57,21 @@ import org.hibernate.HibernateException;
* @author Steve Ebersole
*/
public interface Tuplizer {
/**
* Extract the current values contained on the given entity.
*
* @param entity The entity from which to extract values.
* @return The current property values.
* @throws HibernateException
*/
public Object[] getPropertyValues(Object entity) throws HibernateException;
public Object[] getPropertyValues(Object entity);
/**
* Inject the given values into the given entity.
*
* @param entity The entity.
* @param values The values to be injected.
* @throws HibernateException
*/
public void setPropertyValues(Object entity, Object[] values) throws HibernateException;
public void setPropertyValues(Object entity, Object[] values);
/**
* Extract the value of a particular property from the given entity.
@ -81,17 +79,15 @@ public interface Tuplizer {
* @param entity The entity from which to extract the property value.
* @param i The index of the property for which to extract the value.
* @return The current value of the given property on the given entity.
* @throws HibernateException
*/
public Object getPropertyValue(Object entity, int i) throws HibernateException;
public Object getPropertyValue(Object entity, int i);
/**
* Generate a new, empty entity.
*
* @return The new, empty entity instance.
* @throws HibernateException
*/
public Object instantiate() throws HibernateException;
public Object instantiate();
/**
* Is the given object considered an instance of the the entity (acconting
@ -115,4 +111,11 @@ public interface Tuplizer {
*/
public Class getMappedClass();
/**
* Retrieve the getter for the specified property.
*
* @param i The property index.
* @return The property getter.
*/
public Getter getGetter(int i);
}

View File

@ -42,7 +42,6 @@ import org.hibernate.property.Setter;
* @author Steve Ebersole
*/
public abstract class AbstractComponentTuplizer implements ComponentTuplizer {
protected final Getter[] getters;
protected final Setter[] setters;
protected final int propertySpan;
@ -71,15 +70,6 @@ public abstract class AbstractComponentTuplizer implements ComponentTuplizer {
i++;
}
hasCustomAccessors = foundCustomAccessor;
String[] getterNames = new String[propertySpan];
String[] setterNames = new String[propertySpan];
Class[] propTypes = new Class[propertySpan];
for ( int j = 0; j < propertySpan; j++ ) {
getterNames[j] = getters[j].getMethodName();
setterNames[j] = setters[j].getMethodName();
propTypes[j] = getters[j].getReturnType();
}
instantiator = buildInstantiator( component );
}
@ -128,4 +118,7 @@ public abstract class AbstractComponentTuplizer implements ComponentTuplizer {
throw new UnsupportedOperationException();
}
public Getter getGetter(int i) {
return getters[i];
}
}

View File

@ -51,7 +51,6 @@ import org.hibernate.util.ReflectHelper;
* @author Steve Ebersole
*/
public class PojoComponentTuplizer extends AbstractComponentTuplizer {
private final Class componentClass;
private ReflectionOptimizer optimizer;
private final Getter parentGetter;

View File

@ -140,7 +140,9 @@ public abstract class AbstractEntityTuplizer implements EntityTuplizer {
Property property = (Property) iter.next();
getters[i] = buildPropertyGetter(property, mappingInfo);
setters[i] = buildPropertySetter(property, mappingInfo);
if ( !property.isBasicPropertyAccessor() ) foundCustomAccessor = true;
if ( !property.isBasicPropertyAccessor() ) {
foundCustomAccessor = true;
}
i++;
}
hasCustomAccessors = foundCustomAccessor;
@ -423,4 +425,18 @@ public abstract class AbstractEntityTuplizer implements EntityTuplizer {
return getClass().getName() + '(' + getEntityMetamodel().getName() + ')';
}
public Getter getIdentifierGetter() {
return idGetter;
}
public Getter getVersionGetter() {
if ( getEntityMetamodel().isVersioned() ) {
return getGetter( getEntityMetamodel().getVersionPropertyIndex() );
}
return null;
}
public Getter getGetter(int i) {
return getters[i];
}
}

View File

@ -30,6 +30,7 @@ import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.EntityNameResolver;
import org.hibernate.EntityMode;
import org.hibernate.property.Getter;
import org.hibernate.tuple.Tuplizer;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.engine.SessionFactoryImplementor;
@ -238,4 +239,18 @@ public interface EntityTuplizer extends Tuplizer {
* @throws HibernateException If we are unable to determine an entity-name within the inheritence hierarchy.
*/
public String determineConcreteSubclassEntityName(Object entityInstance, SessionFactoryImplementor factory);
/**
* Retrieve the getter for the identifier property. May return null.
*
* @return The getter for the identifier property.
*/
public Getter getIdentifierGetter();
/**
* Retrieve the getter for the version property. May return null.
*
* @return The getter for the version property.
*/
public Getter getVersionGetter();
}

View File

@ -64,7 +64,6 @@ import org.hibernate.util.ReflectHelper;
* @author Gavin King
*/
public class PojoEntityTuplizer extends AbstractEntityTuplizer {
static final Logger log = LoggerFactory.getLogger( PojoEntityTuplizer.class );
private final Class mappedClass;

View File

@ -38,6 +38,7 @@ import org.hibernate.EntityMode;
import org.hibernate.FetchMode;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.PropertyNotFoundException;
import org.hibernate.engine.CascadeStyle;
import org.hibernate.engine.Mapping;
import org.hibernate.engine.SessionFactoryImplementor;
@ -88,6 +89,10 @@ public class ComponentType extends AbstractType implements AbstractComponentType
this.tuplizerMapping = metamodel.getTuplizerMapping();
}
public EntityModeToTuplizerMapping getTuplizerMapping() {
return tuplizerMapping;
}
public int[] sqlTypes(Mapping mapping) throws MappingException {
//Not called at runtime so doesn't matter if its slow :)
int[] sqlTypes = new int[getColumnSpan( mapping )];
@ -656,4 +661,15 @@ public class ComponentType extends AbstractType implements AbstractComponentType
return false;
}
public int getPropertyIndex(String name) {
String[] names = getPropertyNames();
for ( int i = 0, max = names.length; i < max; i++ ) {
if ( names[i].equals( name ) ) {
return i;
}
}
throw new PropertyNotFoundException(
"Unable to locate property named " + name + " on " + getReturnedClass().getName()
);
}
}

View File

@ -35,6 +35,7 @@ import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.persistence.spi.LoadState;
import org.hibernate.SessionFactory;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.cfg.Configuration;
import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
@ -71,7 +72,7 @@ public class EntityManagerFactoryImpl implements HibernateEntityManagerFactory {
final Iterator<PersistentClass> classes = cfg.getClassMappings();
//a safe guard till we are confident that metamodel is wll tested
if ( !"disabled".equalsIgnoreCase( cfg.getProperty( "hibernate.ejb.metamodel.generation" ) ) ) {
this.metamodel = new MetamodelImpl( classes );
this.metamodel = MetamodelImpl.buildMetamodel( classes, ( SessionFactoryImplementor ) sessionFactory );
}
else {
this.metamodel = null;

View File

@ -87,16 +87,18 @@ public abstract class AbstractIdentifiableType<X>
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<? super X, Y> getId(Class<Y> type) {
public <Y> SingularAttribute<? super X, Y> getId(Class<Y> javaType) {
final SingularAttribute<? super X, Y> id_;
if ( id != null ) {
checkSimpleId();
id_ = ( SingularAttribute<? super X, Y> ) id;
if ( javaType != id.getJavaType() ) {
throw new IllegalArgumentException( "Id attribute was not of specified type : " + javaType.getName() );
}
}
else {
id_ = requireSupertype().getId( type );
id_ = requireSupertype().getId( javaType );
}
// TODO : check that type and id_.getJavaType() are related
return id_;
}
@ -117,10 +119,12 @@ public abstract class AbstractIdentifiableType<X>
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> yClass) {
public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> javaType) {
checkDeclaredId();
checkSimpleId();
// TODO : check that type and id.getJavaType() are related
if ( javaType != id.getJavaType() ) {
throw new IllegalArgumentException( "Id attribute was not of specified type : " + javaType.getName() );
}
return (SingularAttribute<X, Y>) id;
}
@ -177,18 +181,20 @@ public abstract class AbstractIdentifiableType<X>
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y> type) {
public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y> javaType) {
if ( ! hasVersionAttribute() ) {
return null;
}
final SingularAttribute<? super X, Y> version_;
if ( version != null ) {
version_ = ( SingularAttribute<? super X, Y> ) version;
if ( javaType != version.getJavaType() ) {
throw new IllegalArgumentException( "Version attribute was not of specified type : " + javaType.getName() );
}
}
else {
version_ = requireSupertype().getVersion( type );
version_ = requireSupertype().getVersion( javaType );
}
// TODO : check that type and version_.getJavaType() are related
return version_;
}
@ -196,9 +202,11 @@ public abstract class AbstractIdentifiableType<X>
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y> yClass) {
public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y> javaType) {
checkDeclaredVersion();
// TODO : check that type and version_.getJavaType() are related
if ( javaType != version.getJavaType() ) {
throw new IllegalArgumentException( "Version attribute was not of specified type : " + javaType.getName() );
}
return ( SingularAttribute<X, Y> ) version;
}

View File

@ -23,18 +23,22 @@
*/
package org.hibernate.ejb.metamodel;
import java.util.Iterator;
import java.lang.reflect.Member;
import java.util.Iterator;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Type;
import org.hibernate.EntityMode;
import org.hibernate.type.EmbeddedComponentType;
import org.hibernate.type.ComponentType;
import org.hibernate.annotations.common.AssertionFailure;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.Map;
import org.hibernate.mapping.OneToMany;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Value;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Map;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.OneToMany;
import org.hibernate.annotations.common.AssertionFailure;
import org.hibernate.tuple.entity.EntityMetamodel;
/**
* TODO : javadoc
@ -57,12 +61,12 @@ public class AttributeFactory {
attribute = buildPluralAttribute( ownerType, property, attrContext );
}
else {
final Type<Y> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
attribute = new SingularAttributeImpl<X,Y>(
property.getName(),
property.getType().getReturnedClass(),
ownerType,
determineJavaMember( property ),
determineStandardJavaMember( ownerType, property ),
false,
false,
property.isOptional(),
@ -76,19 +80,19 @@ public class AttributeFactory {
@SuppressWarnings( "unchecked" )
private <X, Y, V, K> AttributeImplementor<X, Y> buildPluralAttribute(AbstractManagedType<X> ownerType, Property property, AttributeContext attrContext) {
AttributeImplementor<X, Y> attribute;
final Type<V> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
final Type<V> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
final Class<Y> collectionClass = (Class<Y>) attrContext.getCollectionClass();
if ( java.util.Map.class.isAssignableFrom( collectionClass ) ) {
final Type<K> keyType = getType( attrContext.getKeyTypeStatus(), attrContext.getKeyValue() );
final Type<K> keyType = getType( ownerType, attrContext.getKeyTypeStatus(), attrContext.getKeyValue() );
attribute = PluralAttributeImpl.create( ownerType, attrType, collectionClass, keyType )
.member( determineJavaMember( property ) )
.member( determineStandardJavaMember( ownerType, property ) )
.property( property )
.persistentAttributeType( attrContext.getElementAttributeType() )
.build();
}
else {
attribute = PluralAttributeImpl.create( ownerType, attrType, collectionClass, null )
.member( determineJavaMember( property ) )
.member( determineStandardJavaMember( ownerType, property ) )
.property( property )
.persistentAttributeType( attrContext.getElementAttributeType() )
.build();
@ -96,13 +100,13 @@ public class AttributeFactory {
return attribute;
}
private <X> Type<X> getType(AttributeContext.TypeStatus elementTypeStatus, Value value) {
private <X> Type<X> getType(AbstractManagedType owner, AttributeContext.TypeStatus elementTypeStatus, Value value) {
final org.hibernate.type.Type type = value.getType();
switch ( elementTypeStatus ) {
case BASIC:
return buildBasicType( type );
case EMBEDDABLE:
return buildEmbeddableType( value, type );
return buildEmbeddableType( owner, value, type );
case ENTITY:
return buildEntityType( type );
default:
@ -124,10 +128,10 @@ public class AttributeFactory {
}
@SuppressWarnings( "unchecked" )
private <X> Type<X> buildEmbeddableType(Value value, org.hibernate.type.Type type) {
private <X> Type<X> buildEmbeddableType(AbstractManagedType owner, Value value, org.hibernate.type.Type type) {
//build embedable type
final Class<X> clazz = type.getReturnedClass();
final EmbeddableTypeImpl<X> embeddableType = new EmbeddableTypeImpl<X>( clazz );
final EmbeddableTypeImpl<X> embeddableType = new EmbeddableTypeImpl<X>( clazz, owner, (ComponentType) type );
context.registerEmbeddedableType( embeddableType );
final Component component = (Component) value;
final Iterator<Property> subProperties = component.getPropertyIterator();
@ -142,38 +146,115 @@ public class AttributeFactory {
@SuppressWarnings({ "unchecked" })
public <X, Y> SingularAttributeImpl<X, Y> buildIdAttribute(AbstractManagedType<X> ownerType, Property property) {
final AttributeContext attrContext = getAttributeContext( property );
final Type<Y> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
final Class<Y> idJavaType = property.getType().getReturnedClass();
return new SingularAttributeImpl.Identifier(
property.getName(),
idJavaType,
ownerType,
determineJavaMember( property ),
determineIdentifierJavaMember( ownerType, property ),
attrType,
attrContext.getElementAttributeType()
);
}
@SuppressWarnings({ "UnusedDeclaration" })
private Member determineJavaMember(Property property) {
return null;
private Member determineIdentifierJavaMember(AbstractManagedType ownerType, Property property) {
// see below
// final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( property );
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
if ( ! property.getName().equals( entityMetamodel.getIdentifierProperty().getName() ) ) {
// this *should* indicate processing part of an IdClass...
return determineVirtualIdentifierJavaMember( entityMetamodel, property );
}
return entityMetamodel.getTuplizer( EntityMode.POJO ).getIdentifierGetter().getMember();
}
private Member determineVirtualIdentifierJavaMember(EntityMetamodel entityMetamodel, Property property) {
if ( ! entityMetamodel.getIdentifierProperty().isVirtual() ) {
throw new IllegalArgumentException( "expecting IdClass mapping" );
}
org.hibernate.type.Type type = entityMetamodel.getIdentifierProperty().getType();
if ( ! EmbeddedComponentType.class.isInstance( type ) ) {
throw new IllegalArgumentException( "expecting IdClass mapping" );
}
final EmbeddedComponentType componentType = (EmbeddedComponentType) type;
return componentType.getTuplizerMapping()
.getTuplizer( EntityMode.POJO )
.getGetter( componentType.getPropertyIndex( property.getName() ) )
.getMember();
}
// getting the owning PersistentClass from the Property is broken in certain cases with annotations...
// private EntityMetamodel getDeclarerEntityMetamodel(Property property) {
// return context.getSessionFactory()
// .getEntityPersister( property.getPersistentClass().getEntityName() )
// .getEntityMetamodel();
// }
// so we use the owner's java class to lookup the persister/entitymetamodel
private EntityMetamodel getDeclarerEntityMetamodel(AbstractManagedType ownerType) {
return context.getSessionFactory()
.getEntityPersister( ownerType.getJavaType().getName() )
.getEntityMetamodel();
}
// getting the owning PersistentClass from the Property is broken in certain cases with annotations...
// private Member determineStandardJavaMember(Property property) {
// final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( property );
//
// final String propertyName = property.getName();
// final int index = entityMetamodel.getPropertyIndex( propertyName );
// return entityMetamodel.getTuplizer( EntityMode.POJO ).getGetter( index ).getMember();
// }
// so we use the owner's java class to lookup the persister/entitymetamodel
private Member determineStandardJavaMember(AbstractManagedType ownerType, Property property) {
if ( Type.PersistenceType.EMBEDDABLE == ownerType.getPersistenceType() ) {
EmbeddableTypeImpl embeddableType = ( EmbeddableTypeImpl ) ownerType;
return embeddableType.getHibernateType().getTuplizerMapping()
.getTuplizer( EntityMode.POJO )
.getGetter( embeddableType.getHibernateType().getPropertyIndex( property.getName() ) )
.getMember();
}
else if ( Type.PersistenceType.ENTITY == ownerType.getPersistenceType() ) {
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
final String propertyName = property.getName();
final Integer index = entityMetamodel.getPropertyIndexOrNull( propertyName );
if ( index == null ) {
// just like in #determineIdentifierJavaMember , this *should* indicate we have an IdClass mapping
return determineVirtualIdentifierJavaMember( entityMetamodel, property );
}
else {
return entityMetamodel.getTuplizer( EntityMode.POJO ).getGetter( index ).getMember();
}
}
else {
throw new IllegalArgumentException( "Unexpected owner type : " + ownerType.getPersistenceType() );
}
}
@SuppressWarnings({ "unchecked" })
public <X, Y> SingularAttributeImpl<X, Y> buildVerisonAttribute(AbstractManagedType<X> ownerType, Property property) {
final AttributeContext attrContext = getAttributeContext( property );
final Class<Y> javaType = property.getType().getReturnedClass();
final Type<Y> attrType = getType( attrContext.getElementTypeStatus(), attrContext.getElementValue() );
final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(), attrContext.getElementValue() );
return new SingularAttributeImpl.Version(
property.getName(),
javaType,
ownerType,
determineJavaMember( property ),
determineVersionJavaMember( ownerType, property ),
attrType,
attrContext.getElementAttributeType()
);
}
private Member determineVersionJavaMember(AbstractManagedType ownerType, Property property) {
final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
if ( ! property.getName().equals( entityMetamodel.getVersionProperty().getName() ) ) {
// this should never happen, but to be safe...
throw new IllegalArgumentException( "Given property did not match declared version property" );
}
return entityMetamodel.getTuplizer( EntityMode.POJO ).getIdentifierGetter().getMember();
}
private static class AttributeContext {
private final Value elementValue;
private final TypeStatus typeStatus;

View File

@ -21,11 +21,10 @@
*/
package org.hibernate.ejb.metamodel;
import java.util.Iterator;
import java.io.Serializable;
import javax.persistence.metamodel.EmbeddableType;
import org.hibernate.mapping.Property;
import org.hibernate.type.ComponentType;
/**
* @author Emmanuel Bernard
@ -34,11 +33,24 @@ public class EmbeddableTypeImpl<X>
extends AbstractManagedType<X>
implements EmbeddableType<X>, Serializable {
public EmbeddableTypeImpl(Class<X> javaType) {
private final AbstractManagedType parent;
private final ComponentType hibernateType;
public EmbeddableTypeImpl(Class<X> javaType, AbstractManagedType parent, ComponentType hibernateType) {
super( javaType, null );
this.parent = parent;
this.hibernateType = hibernateType;
}
public PersistenceType getPersistenceType() {
return PersistenceType.EMBEDDABLE;
}
public AbstractManagedType getParent() {
return parent;
}
public ComponentType getHibernateType() {
return hibernateType;
}
}

View File

@ -33,6 +33,7 @@ import javax.persistence.metamodel.SingularAttribute;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.engine.SessionFactoryImplementor;
/**
* Defines a context for storing information during the building of the {@link MetamodelImpl}.
@ -44,6 +45,7 @@ import org.hibernate.mapping.Property;
* @author Emmanuel Bernard
*/
class MetadataContext {
private final SessionFactoryImplementor sessionFactory;
private final AttributeFactory attributeFactory = new AttributeFactory( this );
private HashMap<Class<?>,EntityTypeImpl<?>> entityTypes
@ -55,6 +57,14 @@ class MetadataContext {
private HashMap<Class<?>, EmbeddableTypeImpl<?>> embeddables
= new HashMap<Class<?>, EmbeddableTypeImpl<?>>();
public MetadataContext(SessionFactoryImplementor sessionFactory) {
this.sessionFactory = sessionFactory;
}
/*package*/ SessionFactoryImplementor getSessionFactory() {
return sessionFactory;
}
/**
* Given a Hibernate {@link PersistentClass}, locate the corresponding JPA {@link org.hibernate.type.EntityType}
* implementation. May retur null if the given {@link PersistentClass} has not yet been processed.

View File

@ -32,6 +32,7 @@ import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.EmbeddableType;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.engine.SessionFactoryImplementor;
/**
* Hibernate implementation of the JPA {@link Metamodel} contract.
@ -44,21 +45,25 @@ public class MetamodelImpl implements Metamodel, Serializable {
private final Map<Class<?>, EmbeddableTypeImpl<?>> embeddables;
/**
* Instantiate the metamodel from the collection of Hibernate {@link PersistentClass} models.
* Build the metamodel using the information from the collection of Hibernate
* {@link PersistentClass} models as well as the Hibernate {@link SessionFactory}.
*
* @param persistentClasses An iterator over the Hibernate {@link PersistentClass} models.
* @param persistentClasses Iterator over the Hibernate (config-time) metamodel
* @param sessionFactory The Hibernate session factry.
* @return The built metamodel
*/
public MetamodelImpl(Iterator<PersistentClass> persistentClasses) {
MetadataContext context = new MetadataContext();
public static MetamodelImpl buildMetamodel(
Iterator<PersistentClass> persistentClasses,
SessionFactoryImplementor sessionFactory) {
MetadataContext context = new MetadataContext( sessionFactory );
while ( persistentClasses.hasNext() ) {
locateOrBuildEntityType( persistentClasses.next(), context );
}
this.entities = context.getEntityTypeMap();
context.wrapUp();
this.embeddables = context.getEmbeddableTypeMap();
return new MetamodelImpl( context.getEntityTypeMap(), context.getEmbeddableTypeMap() );
}
private EntityTypeImpl<?> locateOrBuildEntityType(PersistentClass persistentClass, MetadataContext context) {
private static EntityTypeImpl<?> locateOrBuildEntityType(PersistentClass persistentClass, MetadataContext context) {
EntityTypeImpl<?> entityType = context.locateEntityType( persistentClass );
if ( entityType == null ) {
entityType = buildEntityType( persistentClass, context );
@ -67,7 +72,7 @@ public class MetamodelImpl implements Metamodel, Serializable {
}
@SuppressWarnings({ "unchecked" })
private EntityTypeImpl<?> buildEntityType(PersistentClass persistentClass, MetadataContext context) {
private static EntityTypeImpl<?> buildEntityType(PersistentClass persistentClass, MetadataContext context) {
final PersistentClass superPersistentClass = persistentClass.getSuperclass();
final EntityTypeImpl superEntityType = superPersistentClass == null
? null
@ -84,6 +89,19 @@ public class MetamodelImpl implements Metamodel, Serializable {
return entityType;
}
/**
* Instantiate the metamodel.
*
* @param entities The entity mappings.
* @param embeddables The embeddable (component) mappings.
*/
private MetamodelImpl(
Map<Class<?>, EntityTypeImpl<?>> entities,
Map<Class<?>, EmbeddableTypeImpl<?>> embeddables) {
this.entities = entities;
this.embeddables = embeddables;
}
/**
* {@inheritDoc}
*/

View File

@ -37,6 +37,16 @@ public class MetadataTest extends TestCase {
final SingularAttribute<Fridge, Long> id = fridgeType.getDeclaredId( Long.class );
assertNotNull( id );
assertTrue( id.isId() );
try {
fridgeType.getDeclaredId( java.util.Date.class );
fail( "expecting failure" );
}
catch ( IllegalArgumentException ignore ) {
// expected result
}
final SingularAttribute<? super Fridge, Long> id2 = fridgeType.getId( Long.class );
assertNotNull( id2 );
assertEquals( Fridge.class.getName(), fridgeType.getName() );
assertEquals( Long.class, fridgeType.getIdType().getJavaType() );
assertTrue( fridgeType.hasSingleIdAttribute() );