1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package net.sumaris.core.dao.technical.hibernate;
24
25 import net.sumaris.core.config.SumarisConfiguration;
26 import net.sumaris.core.exception.SumarisTechnicalException;
27 import org.hibernate.boot.MetadataSources;
28 import org.hibernate.boot.internal.MetadataBuilderImpl;
29 import org.hibernate.boot.model.IdGeneratorStrategyInterpreter;
30 import org.hibernate.boot.model.IdentifierGeneratorDefinition;
31 import org.hibernate.boot.spi.MetadataBuilderFactory;
32 import org.hibernate.boot.spi.MetadataBuilderImplementor;
33 import org.hibernate.cfg.BinderHelper;
34 import org.hibernate.id.PersistentIdentifierGenerator;
35 import org.hibernate.id.enhanced.SequenceStyleGenerator;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import javax.persistence.GenerationType;
40 import javax.persistence.SequenceGenerator;
41 import javax.persistence.TableGenerator;
42
43
44
45
46
47
48
49 public class CustomMetadataBuilderFactory implements MetadataBuilderFactory {
50
51 private static final Logger LOG = LoggerFactory.getLogger(CustomMetadataBuilderFactory.class);
52
53
54 public CustomMetadataBuilderFactory() {
55 }
56
57 @Override
58 public MetadataBuilderImplementor getMetadataBuilder(MetadataSources metadatasources, MetadataBuilderImplementor defaultBuilder) {
59
60 SumarisConfiguration config = SumarisConfiguration.getInstance();
61
62
63 int allocationSize = config != null ? config.getSequenceIncrementValue() : 0;
64 if (allocationSize <= 0) {
65 LOG.debug(String.format("invalid allocationSize : %s, fallback to default MetadataBuilderImplementor", allocationSize));
66 return null;
67 }
68
69 MetadataBuilderImplementor implementor = new MetadataBuilderImpl(metadatasources, defaultBuilder.getBootstrapContext().getServiceRegistry());
70 implementor.applyIdGenerationTypeInterpreter(new ConfigurableSequenceGenerator(allocationSize));
71 return implementor;
72 }
73
74 static class ConfigurableSequenceGenerator implements IdGeneratorStrategyInterpreter {
75
76 private final int allocationSize;
77
78 ConfigurableSequenceGenerator(int allocationSize) {
79 this.allocationSize = allocationSize;
80 }
81
82 @Override
83 public String determineGeneratorName(GenerationType generationType, GeneratorNameDeterminationContext context) {
84 if (generationType == GenerationType.SEQUENCE) {
85 return SequenceStyleGenerator.class.getName();
86 }
87 throw new SumarisTechnicalException("Only SEQUENCE strategy is allowed !");
88 }
89
90 @Override
91 public void interpretTableGenerator(TableGenerator tableGeneratorAnnotation, IdentifierGeneratorDefinition.Builder definitionBuilder) {
92 throw new SumarisTechnicalException("Only SEQUENCE strategy is allowed !");
93 }
94
95 @Override
96 public void interpretSequenceGenerator(
97 SequenceGenerator sequenceGeneratorAnnotation,
98 IdentifierGeneratorDefinition.Builder definitionBuilder) {
99 definitionBuilder.setName( sequenceGeneratorAnnotation.name() );
100 definitionBuilder.setStrategy( SequenceStyleGenerator.class.getName() );
101
102 if ( !BinderHelper.isEmptyAnnotationValue( sequenceGeneratorAnnotation.catalog() ) ) {
103 definitionBuilder.addParam(
104 PersistentIdentifierGenerator.CATALOG,
105 sequenceGeneratorAnnotation.catalog()
106 );
107 }
108 if ( !BinderHelper.isEmptyAnnotationValue( sequenceGeneratorAnnotation.schema() ) ) {
109 definitionBuilder.addParam(
110 PersistentIdentifierGenerator.SCHEMA,
111 sequenceGeneratorAnnotation.schema()
112 );
113 }
114 if ( !BinderHelper.isEmptyAnnotationValue( sequenceGeneratorAnnotation.sequenceName() ) ) {
115 definitionBuilder.addParam(
116 SequenceStyleGenerator.SEQUENCE_PARAM,
117 sequenceGeneratorAnnotation.sequenceName()
118 );
119 }
120
121 definitionBuilder.addParam(
122 SequenceStyleGenerator.INCREMENT_PARAM,
123
124 String.valueOf( allocationSize )
125 );
126 definitionBuilder.addParam(
127 SequenceStyleGenerator.INITIAL_PARAM,
128 String.valueOf( sequenceGeneratorAnnotation.initialValue() )
129 );
130 }
131 }
132 }