diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java index 7b9f7c5eff7b..8911afd2acc8 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java @@ -35,6 +35,7 @@ import org.hibernate.mapping.Collection; import org.hibernate.mapping.Column; import org.hibernate.mapping.DependantValue; +import org.hibernate.mapping.Formula; import org.hibernate.mapping.JoinedSubclass; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; @@ -570,7 +571,11 @@ public static void bindFk( mappedByColumns = property.getValue().getColumnIterator(); } while ( mappedByColumns.hasNext() ) { - Column column = (Column) mappedByColumns.next(); + Object o = mappedByColumns.next(); + if(o instanceof Formula) { + throw new AnnotationException("Formula is not supported along with this type of relationship"); + } + Column column = (Column) o; columns[0].overrideFromReferencedColumnIfNecessary( column ); columns[0].linkValueUsingAColumnCopy( column, value ); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/formula/JoinFormulaWithOneToMany.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/formula/JoinFormulaWithOneToMany.java new file mode 100644 index 000000000000..2e1dfb3d13f5 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/formula/JoinFormulaWithOneToMany.java @@ -0,0 +1,147 @@ +package org.hibernate.test.annotations.formula; + +import org.hibernate.annotations.JoinFormula; +import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; +import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor; +import org.hibernate.testing.FailureExpected; +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseUnitTestCase; +import org.junit.Test; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.SharedCacheMode; +import javax.persistence.Table; +import javax.persistence.ValidationMode; +import javax.persistence.spi.ClassTransformer; +import javax.persistence.spi.PersistenceUnitInfo; +import javax.persistence.spi.PersistenceUnitTransactionType; +import javax.sql.DataSource; +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +public class JoinFormulaWithOneToMany extends BaseUnitTestCase { + + @Test + @TestForIssue(jiraKey = "HHH-12997") + @FailureExpected(jiraKey = "HHH-12997") + public void testJoinFormulaWithOneToMany() { + + PersistenceUnitInfo info = new PersistenceUnitInfo() { + @Override + public String getPersistenceUnitName() { + return "test"; + } + + @Override + public String getPersistenceProviderClassName() { + return null; + } + + @Override + public PersistenceUnitTransactionType getTransactionType() { + return null; + } + + @Override + public DataSource getJtaDataSource() { + return null; + } + + @Override + public DataSource getNonJtaDataSource() { + return null; + } + + @Override + public List getMappingFileNames() { + return null; + } + + @Override + public List getJarFileUrls() { + return null; + } + + @Override + public URL getPersistenceUnitRootUrl() { + return null; + } + + @Override + public List getManagedClassNames() { + return Arrays.asList(Parent.class.getName(), Child.class.getName()); + } + + @Override + public boolean excludeUnlistedClasses() { + return false; + } + + @Override + public SharedCacheMode getSharedCacheMode() { + return null; + } + + @Override + public ValidationMode getValidationMode() { + return null; + } + + @Override + public Properties getProperties() { + return new Properties(); + } + + @Override + public String getPersistenceXMLSchemaVersion() { + return null; + } + + @Override + public ClassLoader getClassLoader() { + return null; + } + + @Override + public void addTransformer(ClassTransformer transformer) { + + } + + @Override + public ClassLoader getNewTempClassLoader() { + return null; + } + + }; + + new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(info), + Collections.singletonMap("hibernate.dialect", "org.hibernate.dialect.H2Dialect")).build(); + + } + + @Entity @Table(name = "child") class Child { + + @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; + + @ManyToOne() @JoinFormula(value = "(SELECT * FROM child)") private Parent parent; + + } + + @Entity @Table(name = "parent") class Parent { + + @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; + + @OneToMany(mappedBy = "parent") private Set childs; + + } + +}