use of org.hibernate.type.ComponentType in project jbosstools-hibernate by jbosstools.
the class TypeFacadeTest method testIsComponentType.
@Test
public void testIsComponentType() {
IType typeFacade = null;
ClassType classType = new ClassType();
typeFacade = FACADE_FACTORY.createType(classType);
Assert.assertFalse(typeFacade.isComponentType());
MetadataBuildingOptions mdbo = new MetadataBuilderImpl.MetadataBuildingOptionsImpl(new StandardServiceRegistryBuilder().build());
MetadataImplementor mdi = (MetadataImplementor) new MetadataBuilderImpl(new MetadataSources()).build();
ComponentType componentType = new ComponentType(null, new ComponentMetamodel(new Component(mdi, new RootClass(null)), mdbo));
typeFacade = FACADE_FACTORY.createType(componentType);
Assert.assertTrue(typeFacade.isComponentType());
}
use of org.hibernate.type.ComponentType in project hibernate-orm by hibernate.
the class CollectionMetadataGenerator method addValueToMiddleTable.
/**
* @param value Value, which should be mapped to the middle-table, either as a relation to another entity,
* or as a simple value.
* @param xmlMapping If not <code>null</code>, xml mapping for this value is added to this element.
* @param queryGeneratorBuilder In case <code>value</code> is a relation to another entity, information about it
* should be added to the given.
* @param prefix Prefix for proeprty names of related entities identifiers.
* @param joinColumns Names of columns to use in the xml mapping, if this array isn't null and has any elements.
*
* @return Data for mapping this component.
*/
@SuppressWarnings({ "unchecked" })
private MiddleComponentData addValueToMiddleTable(Value value, Element xmlMapping, QueryGeneratorBuilder queryGeneratorBuilder, String prefix, JoinColumn[] joinColumns, boolean key) {
final Type type = value.getType();
if (type instanceof ManyToOneType) {
final String prefixRelated = prefix + "_";
final String referencedEntityName = MappingTools.getReferencedEntityName(value);
final IdMappingData referencedIdMapping = mainGenerator.getReferencedIdMappingData(referencingEntityName, referencedEntityName, propertyAuditingData, true);
// relation isn't inverse (so when <code>xmlMapping</code> is not null).
if (xmlMapping != null) {
addRelatedToXmlMapping(xmlMapping, prefixRelated, joinColumns != null && joinColumns.length > 0 ? MetadataTools.getColumnNameIterator(joinColumns) : MetadataTools.getColumnNameIterator(value.getColumnIterator()), referencedIdMapping);
}
// Storing the id data of the referenced entity: original mapper, prefixed mapper and entity name.
final MiddleIdData referencedIdData = createMiddleIdData(referencedIdMapping, prefixRelated, referencedEntityName);
// And adding it to the generator builder.
queryGeneratorBuilder.addRelation(referencedIdData);
return new MiddleComponentData(new MiddleRelatedComponentMapper(referencedIdData), queryGeneratorBuilder.getCurrentIndex());
} else if (type instanceof ComponentType) {
// Collection of embeddable elements.
final Component component = (Component) value;
final Class componentClass = ReflectionTools.loadClass(component.getComponentClassName(), mainGenerator.getClassLoaderService());
final MiddleEmbeddableComponentMapper componentMapper = new MiddleEmbeddableComponentMapper(new MultiPropertyMapper(), componentClass);
final Element parentXmlMapping = xmlMapping.getParent();
final ComponentAuditingData auditData = new ComponentAuditingData();
final ReflectionManager reflectionManager = mainGenerator.getMetadata().getMetadataBuildingOptions().getReflectionManager();
new ComponentAuditedPropertiesReader(ModificationStore.FULL, new AuditedPropertiesReader.ComponentPropertiesSource(reflectionManager, component), auditData, mainGenerator.getGlobalCfg(), reflectionManager, "").read();
// Emulating first pass.
for (String auditedPropertyName : auditData.getPropertyNames()) {
final PropertyAuditingData nestedAuditingData = auditData.getPropertyAuditingData(auditedPropertyName);
mainGenerator.addValue(parentXmlMapping, component.getProperty(auditedPropertyName).getValue(), componentMapper, prefix, xmlMappingData, nestedAuditingData, true, true, true);
}
// Emulating second pass so that the relations can be mapped too.
for (String auditedPropertyName : auditData.getPropertyNames()) {
final PropertyAuditingData nestedAuditingData = auditData.getPropertyAuditingData(auditedPropertyName);
mainGenerator.addValue(parentXmlMapping, component.getProperty(auditedPropertyName).getValue(), componentMapper, referencingEntityName, xmlMappingData, nestedAuditingData, true, false, true);
}
// Embeddable properties may contain null values, so cannot be stored within composite primary key.
if (propertyValue.isSet()) {
final String setOrdinalPropertyName = mainGenerator.getVerEntCfg().getEmbeddableSetOrdinalPropertyName();
final Element ordinalProperty = MetadataTools.addProperty(xmlMapping, setOrdinalPropertyName, "integer", true, true);
MetadataTools.addColumn(ordinalProperty, setOrdinalPropertyName, null, null, null, null, null, null, false);
}
return new MiddleComponentData(componentMapper, 0);
} else {
// Last but one parameter: collection components are always insertable
final boolean mapped = mainGenerator.getBasicMetadataGenerator().addBasic(key ? xmlMapping : xmlMapping.getParent(), new PropertyAuditingData(prefix, "field", ModificationStore.FULL, RelationTargetAuditMode.AUDITED, null, null, false), value, null, true, key);
if (mapped && key) {
// Simple values are always stored in the first item of the array returned by the query generator.
return new MiddleComponentData(new MiddleSimpleComponentMapper(mainGenerator.getVerEntCfg(), prefix), 0);
} else if (mapped && !key) {
// when mapped but not part of the key, its stored as a dummy mapper??
return new MiddleComponentData(new MiddleMapElementNotKeyComponentMapper(mainGenerator.getVerEntCfg(), prefix), 0);
} else {
mainGenerator.throwUnsupportedTypeException(type, referencingEntityName, propertyName);
// Impossible to get here.
throw new AssertionError();
}
}
}
use of org.hibernate.type.ComponentType in project ysoserial by frohoff.
the class Hibernate1 method makeCaller.
static Object makeCaller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException {
PojoComponentTuplizer tup = Reflections.createWithoutConstructor(PojoComponentTuplizer.class);
Reflections.getField(AbstractComponentTuplizer.class, "getters").set(tup, getters);
ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]);
Reflections.setFieldValue(t, "componentTuplizer", tup);
Reflections.setFieldValue(t, "propertySpan", 1);
Reflections.setFieldValue(t, "propertyTypes", new Type[] { t });
TypedValue v1 = new TypedValue(t, null);
Reflections.setFieldValue(v1, "value", tpl);
Reflections.setFieldValue(v1, "type", t);
TypedValue v2 = new TypedValue(t, null);
Reflections.setFieldValue(v2, "value", tpl);
Reflections.setFieldValue(v2, "type", t);
return Gadgets.makeMap(v1, v2);
}
use of org.hibernate.type.ComponentType in project midpoint by Evolveum.
the class MidpointPersisterUtil method killUnwantedAssociationValues.
private static void killUnwantedAssociationValues(String[] propertyNames, Type[] propertyTypes, Object[] values, int depth) {
if (values == null) {
return;
}
for (int i = 0; i < propertyTypes.length; i++) {
String name = propertyNames[i];
Type type = propertyTypes[i];
Object value = values[i];
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("{}- killUnwantedAssociationValues processing #{}: {} (type={}, value={})", StringUtils.repeat(" ", depth), i, name, type, value);
}
if (type instanceof ComponentType) {
ComponentType componentType = (ComponentType) type;
killUnwantedAssociationValues(componentType.getPropertyNames(), componentType.getSubtypes(), (Object[]) value, depth + 1);
} else if (type instanceof ManyToOneType) {
if (ASSOCIATION_TO_REMOVE.equals(name)) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("{}- killUnwantedAssociationValues KILLED #{}: {} (type={}, value={})", StringUtils.repeat(" ", depth), i, name, type, value);
}
values[i] = null;
}
}
}
}
use of org.hibernate.type.ComponentType in project hibernate-orm by hibernate.
the class ASTParserLoadingTest method testComponentQueries.
@Test
public void testComponentQueries() {
Session s = openSession();
s.beginTransaction();
Type[] types = s.createQuery("select h.name from Human h").getReturnTypes();
assertEquals(1, types.length);
assertTrue(types[0] instanceof ComponentType);
// Test the ability to perform comparisons between component values
s.createQuery("from Human h where h.name = h.name").list();
s.createQuery("from Human h where h.name = :name").setParameter("name", new Name()).list();
s.createQuery("from Human where name = :name").setParameter("name", new Name()).list();
s.createQuery("from Human h where :name = h.name").setParameter("name", new Name()).list();
s.createQuery("from Human h where :name <> h.name").setParameter("name", new Name()).list();
// Test the ability to perform comparisons between a component and an explicit row-value
s.createQuery("from Human h where h.name = ('John', 'X', 'Doe')").list();
s.createQuery("from Human h where ('John', 'X', 'Doe') = h.name").list();
s.createQuery("from Human h where ('John', 'X', 'Doe') <> h.name").list();
s.createQuery("from Human h order by h.name").list();
s.getTransaction().commit();
s.close();
}
Aggregations