Skip to content

Commit 727e51c

Browse files
committed
HHH-7436 Initial many-to-many annotation support
1 parent a36af14 commit 727e51c

File tree

2 files changed

+85
-16
lines changed

2 files changed

+85
-16
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/ManyToManyPluralAttributeElementSourceImpl.java

Lines changed: 82 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,47 @@
3131
import org.hibernate.engine.spi.CascadeStyle;
3232
import org.hibernate.metamodel.internal.source.annotations.attribute.Column;
3333
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
34+
import org.hibernate.metamodel.internal.source.annotations.util.EnumConversionHelper;
35+
import org.hibernate.metamodel.internal.source.annotations.util.JPADotNames;
36+
import org.hibernate.metamodel.internal.source.annotations.util.JandexHelper;
3437
import org.hibernate.metamodel.spi.binding.CascadeType;
38+
import org.hibernate.metamodel.spi.relational.Value;
3539
import org.hibernate.metamodel.spi.source.ForeignKeyContributingSource;
3640
import org.hibernate.metamodel.spi.source.ManyToManyPluralAttributeElementSource;
3741
import org.hibernate.metamodel.spi.source.RelationalValueSource;
42+
import org.jboss.jandex.AnnotationInstance;
3843

3944
/**
4045
* @author Hardy Ferentschik
46+
* @author Brett Meyer
4147
*/
4248
public class ManyToManyPluralAttributeElementSourceImpl implements ManyToManyPluralAttributeElementSource {
49+
4350
private final PluralAssociationAttribute associationAttribute;
44-
45-
public ManyToManyPluralAttributeElementSourceImpl(PluralAssociationAttribute associationAttribute) {
51+
private final List<RelationalValueSource> relationalValueSources
52+
= new ArrayList<RelationalValueSource>();
53+
private final Collection<String> referencedColumnNames
54+
= new HashSet<String>();
55+
private final Iterable<CascadeStyle> cascadeStyles;
56+
57+
public ManyToManyPluralAttributeElementSourceImpl(
58+
PluralAssociationAttribute associationAttribute) {
4659
this.associationAttribute = associationAttribute;
60+
61+
for ( Column column : associationAttribute.getJoinColumnValues() ) {
62+
relationalValueSources.add( new ColumnSourceImpl(
63+
associationAttribute, null, column ) );
64+
}
65+
66+
for ( Column column : associationAttribute.getJoinColumnValues() ) {
67+
if ( column.getReferencedColumnName() != null ) {
68+
referencedColumnNames.add( column.getReferencedColumnName() );
69+
}
70+
}
71+
72+
cascadeStyles = EnumConversionHelper.cascadeTypeToCascadeStyleSet(
73+
associationAttribute.getCascadeTypes(),
74+
associationAttribute.getContext() );
4775
}
4876

4977
@Override
@@ -59,28 +87,16 @@ public String getReferencedEntityAttributeName() {
5987

6088
@Override
6189
public Collection<String> getReferencedColumnNames() {
62-
HashSet<String> referencedColumnNames = new HashSet<String>();
63-
for ( Column column : associationAttribute.getJoinColumnValues() ) {
64-
if ( column.getReferencedColumnName() != null ) {
65-
referencedColumnNames.add( column.getReferencedColumnName() );
66-
}
67-
}
6890
return referencedColumnNames;
6991
}
7092

7193
@Override
7294
public List<RelationalValueSource> relationalValueSources() {
73-
List<RelationalValueSource> valueSources = new ArrayList<RelationalValueSource>();
74-
// todo
75-
return valueSources;
95+
return relationalValueSources;
7696
}
7797

7898
@Override
7999
public Iterable<CascadeStyle> getCascadeStyles() {
80-
List<CascadeStyle> cascadeStyles = new ArrayList<CascadeStyle>();
81-
for ( javax.persistence.CascadeType cascadeType : associationAttribute.getCascadeTypes() ) {
82-
cascadeStyles.add( CascadeType.getCascadeType( cascadeType ).toCascadeStyle() );
83-
}
84100
return cascadeStyles;
85101
}
86102

@@ -96,7 +112,8 @@ public String getExplicitForeignKeyName() {
96112

97113
@Override
98114
public JoinColumnResolutionDelegate getForeignKeyTargetColumnResolutionDelegate() {
99-
return null; //To change body of implemented methods use File | Settings | File Templates.
115+
return associationAttribute.getJoinColumnValues()
116+
.isEmpty() ? null : new AnnotationJoinColumnResolutionDelegate();
100117
}
101118

102119
@Override
@@ -138,6 +155,55 @@ public boolean areValuesIncludedInUpdateByDefault() {
138155
public boolean areValuesNullableByDefault() {
139156
return false;
140157
}
158+
159+
// TODO: Taken from and in duplicate of ToOneAttributeSourceImpl. Look into
160+
// abstracting some of this out.
161+
public class AnnotationJoinColumnResolutionDelegate
162+
implements ForeignKeyContributingSource.JoinColumnResolutionDelegate {
163+
private final String logicalJoinTableName;
164+
165+
public AnnotationJoinColumnResolutionDelegate() {
166+
logicalJoinTableName = resolveLogicalJoinTableName();
167+
}
168+
169+
@Override
170+
public List<Value> getJoinColumns(JoinColumnResolutionContext context) {
171+
final List<Value> values = new ArrayList<Value>();
172+
for ( Column column : associationAttribute.getJoinColumnValues() ) {
173+
if ( column.getReferencedColumnName() == null ) {
174+
return context.resolveRelationalValuesForAttribute( null );
175+
}
176+
org.hibernate.metamodel.spi.relational.Column resolvedColumn = context.resolveColumn(
177+
column.getReferencedColumnName(),
178+
logicalJoinTableName,
179+
null,
180+
null
181+
);
182+
values.add( resolvedColumn );
183+
}
184+
return values;
185+
}
186+
187+
@Override
188+
public String getReferencedAttributeName() {
189+
// in annotations we are not referencing attribute but column names via @JoinColumn(s)
190+
return null;
191+
}
192+
193+
private String resolveLogicalJoinTableName() {
194+
final AnnotationInstance joinTableAnnotation = JandexHelper.getSingleAnnotation(
195+
associationAttribute.annotations(),
196+
JPADotNames.JOIN_TABLE
197+
);
198+
199+
if ( joinTableAnnotation != null ) {
200+
return JandexHelper.getValue( joinTableAnnotation, "name", String.class );
201+
}
202+
203+
// todo : this ties into the discussion about naming strategies. This would be part of a logical naming strategy...
204+
return null;
205+
}
206+
}
141207
}
142208

143209

hibernate-core/src/test/java/org/hibernate/test/annotations/manytomany/CatPk.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
//$Id$
22
package org.hibernate.test.annotations.manytomany;
33
import java.io.Serializable;
4+
45
import javax.persistence.Column;
6+
import javax.persistence.Embeddable;
57

68
/**
79
* @author Emmanuel Bernard
810
*/
11+
@Embeddable
912
public class CatPk implements Serializable {
1013
private String name;
1114
private String thoroughbred;

0 commit comments

Comments
 (0)