3333import jakarta .persistence .PrimaryKeyJoinColumn ;
3434import jakarta .persistence .PrimaryKeyJoinColumns ;
3535
36+ import static org .hibernate .boot .models .JpaAnnotations .JOIN_COLUMN ;
37+ import static org .hibernate .boot .models .JpaAnnotations .JOIN_COLUMNS ;
38+
3639/**
3740 * XML -> AnnotationUsage support for {@linkplain JaxbColumnJoined}: <ul>
3841 * <li>{@code <join-column/>}</li>
@@ -53,8 +56,8 @@ public static void applyJoinColumns(
5356 }
5457
5558 final JoinColumnsJpaAnnotation columnsAnn = (JoinColumnsJpaAnnotation ) memberDetails .replaceAnnotationUsage (
56- JpaAnnotations . JOIN_COLUMN ,
57- JpaAnnotations . JOIN_COLUMNS ,
59+ JOIN_COLUMN ,
60+ JOIN_COLUMNS ,
5861 xmlDocumentContext .getModelBuildingContext ()
5962 );
6063 columnsAnn .value ( transformJoinColumnList (
@@ -74,7 +77,7 @@ public static JoinColumn[] transformJoinColumnList(
7477
7578 final JoinColumn [] joinColumns = new JoinColumn [jaxbJoinColumns .size ()];
7679 for ( int i = 0 ; i < jaxbJoinColumns .size (); i ++ ) {
77- final JoinColumnJpaAnnotation joinColumn = JpaAnnotations . JOIN_COLUMN .createUsage ( xmlDocumentContext .getModelBuildingContext () );
80+ final JoinColumnJpaAnnotation joinColumn = JOIN_COLUMN .createUsage ( xmlDocumentContext .getModelBuildingContext () );
7881 joinColumns [i ] = joinColumn ;
7982 joinColumn .apply ( jaxbJoinColumns .get ( i ), xmlDocumentContext );
8083 }
@@ -86,40 +89,74 @@ public static void applyJoinColumnsOrFormulas(
8689 MutableMemberDetails memberDetails ,
8790 XmlDocumentContext xmlDocumentContext ) {
8891 if ( !CollectionHelper .isEmpty ( jaxbJoinColumnsOrFormulas ) ) {
89- memberDetails .removeAnnotationUsage ( JpaAnnotations .JOIN_COLUMN );
90- memberDetails .removeAnnotationUsage ( JpaAnnotations .JOIN_COLUMNS );
91- final JoinColumnsOrFormulasAnnotation joinColumnsOrFormulasUsage = (JoinColumnsOrFormulasAnnotation ) memberDetails .replaceAnnotationUsage (
92- HibernateAnnotations .JOIN_COLUMN_OR_FORMULA ,
93- HibernateAnnotations .JOIN_COLUMNS_OR_FORMULAS ,
92+ if ( hasOnlyJoinColumns (jaxbJoinColumnsOrFormulas ) ) {
93+ applyPureJoinColumns ( jaxbJoinColumnsOrFormulas , memberDetails , xmlDocumentContext );
94+ }
95+ else {
96+ memberDetails .removeAnnotationUsage ( JpaAnnotations .JOIN_COLUMN );
97+ memberDetails .removeAnnotationUsage ( JpaAnnotations .JOIN_COLUMNS );
98+ final JoinColumnsOrFormulasAnnotation joinColumnsOrFormulasUsage = (JoinColumnsOrFormulasAnnotation ) memberDetails .replaceAnnotationUsage (
99+ HibernateAnnotations .JOIN_COLUMN_OR_FORMULA ,
100+ HibernateAnnotations .JOIN_COLUMNS_OR_FORMULAS ,
101+ xmlDocumentContext .getModelBuildingContext ()
102+ );
103+
104+ final JoinColumnOrFormula [] joinColumnOrFormulaList = new JoinColumnOrFormula [jaxbJoinColumnsOrFormulas .size ()];
105+ joinColumnsOrFormulasUsage .value ( joinColumnOrFormulaList );
106+
107+ for ( int i = 0 ; i < jaxbJoinColumnsOrFormulas .size (); i ++ ) {
108+ final JoinColumnOrFormulaAnnotation joinColumnOrFormulaUsage = HibernateAnnotations .JOIN_COLUMN_OR_FORMULA .createUsage (
109+ xmlDocumentContext .getModelBuildingContext () );
110+ joinColumnOrFormulaList [i ] = joinColumnOrFormulaUsage ;
111+
112+ final Serializable jaxbJoinColumnOrFormula = jaxbJoinColumnsOrFormulas .get ( i );
113+ if ( jaxbJoinColumnOrFormula instanceof JaxbJoinColumnImpl jaxbJoinColumn ) {
114+ final JoinColumnJpaAnnotation joinColumnUsage = JpaAnnotations .JOIN_COLUMN .createUsage (
115+ xmlDocumentContext .getModelBuildingContext () );
116+ joinColumnOrFormulaUsage .column ( joinColumnUsage );
117+ joinColumnUsage .apply ( jaxbJoinColumn , xmlDocumentContext );
118+ }
119+ else if ( jaxbJoinColumnOrFormula instanceof String jaxbJoinFormula ) {
120+ final JoinFormulaAnnotation joinFormulaUsage = HibernateAnnotations .JOIN_FORMULA .createUsage (
121+ xmlDocumentContext .getModelBuildingContext () );
122+ joinColumnOrFormulaUsage .formula ( joinFormulaUsage );
123+ joinFormulaUsage .value ( jaxbJoinFormula );
124+ }
125+ else {
126+ throw new MappingException (
127+ "Unexpected join-column-or-formula type : " + jaxbJoinColumnOrFormula );
128+ }
129+ }
130+ }
131+ }
132+ }
133+
134+ private static boolean hasOnlyJoinColumns (List <Serializable > jaxbJoinColumnsOrFormulas ) {
135+ return jaxbJoinColumnsOrFormulas .stream ().allMatch ( element -> element instanceof JaxbJoinColumnImpl );
136+ }
137+
138+ private static void applyPureJoinColumns (
139+ List <Serializable > jaxbJoinColumns ,
140+ MutableMemberDetails memberDetails ,
141+ XmlDocumentContext xmlDocumentContext ) {
142+ memberDetails .removeAnnotationUsage ( JOIN_COLUMN );
143+ memberDetails .removeAnnotationUsage ( JOIN_COLUMNS );
144+ final JoinColumnsJpaAnnotation joinColumnsUsage = (JoinColumnsJpaAnnotation ) memberDetails .replaceAnnotationUsage (
145+ JOIN_COLUMN ,
146+ JOIN_COLUMNS ,
94147 xmlDocumentContext .getModelBuildingContext ()
95148 );
96149
97- final JoinColumnOrFormula [] joinColumnOrFormulaList = new JoinColumnOrFormula [ jaxbJoinColumnsOrFormulas .size ()];
98- joinColumnsOrFormulasUsage .value ( joinColumnOrFormulaList );
150+ final JoinColumn [] joinColumn = new JoinColumn [ jaxbJoinColumns .size ()];
151+ joinColumnsUsage .value ( joinColumn );
99152
100- for ( int i = 0 ; i < jaxbJoinColumnsOrFormulas .size (); i ++ ) {
101- final JoinColumnOrFormulaAnnotation joinColumnOrFormulaUsage = HibernateAnnotations .JOIN_COLUMN_OR_FORMULA .createUsage (
153+ for ( int i = 0 ; i < jaxbJoinColumns .size (); i ++ ) {
154+ final Serializable jaxbJoinColumnOrFormula = jaxbJoinColumns .get ( i );
155+ final JoinColumnJpaAnnotation joinColumnUsage = JOIN_COLUMN .createUsage (
102156 xmlDocumentContext .getModelBuildingContext () );
103- joinColumnOrFormulaList [i ] = joinColumnOrFormulaUsage ;
104-
105- final Serializable jaxbJoinColumnOrFormula = jaxbJoinColumnsOrFormulas .get ( i );
106- if ( jaxbJoinColumnOrFormula instanceof JaxbJoinColumnImpl jaxbJoinColumn ) {
107- final JoinColumnJpaAnnotation joinColumnUsage = JpaAnnotations .JOIN_COLUMN .createUsage (
108- xmlDocumentContext .getModelBuildingContext () );
109- joinColumnOrFormulaUsage .column ( joinColumnUsage );
110- joinColumnUsage .apply ( jaxbJoinColumn , xmlDocumentContext );
111- }
112- else if ( jaxbJoinColumnOrFormula instanceof String jaxbJoinFormula ) {
113- final JoinFormulaAnnotation joinFormulaUsage = HibernateAnnotations .JOIN_FORMULA .createUsage (
114- xmlDocumentContext .getModelBuildingContext () );
115- joinColumnOrFormulaUsage .formula ( joinFormulaUsage );
116- joinFormulaUsage .value ( jaxbJoinFormula );
117- }
118- else {
119- throw new MappingException ( "Unexpected join-column-or-formula type : " + jaxbJoinColumnOrFormula );
120- }
157+ joinColumn [i ] = joinColumnUsage ;
158+ joinColumnUsage .apply ( (JaxbJoinColumnImpl ) jaxbJoinColumnOrFormula , xmlDocumentContext );
121159 }
122- }
123160 }
124161
125162 /**
0 commit comments