Skip to content

Commit 2f335cd

Browse files
committed
HHH-18377 - Support for uuid v6 and v7 generated ids
1 parent d1cb9c3 commit 2f335cd

File tree

2 files changed

+55
-65
lines changed

2 files changed

+55
-65
lines changed

hibernate-core/src/main/java/org/hibernate/annotations/UuidGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,14 @@ enum Style {
6060
* version 6.
6161
* @see UuidVersion6Strategy
6262
*/
63+
@Incubating
6364
VERSION_6,
6465
/**
6566
* Use a time-based generation strategy consistent with RFC 4122
6667
* version 7.
6768
* @see UuidVersion7Strategy
6869
*/
70+
@Incubating
6971
VERSION_7
7072
}
7173

hibernate-core/src/main/java/org/hibernate/id/uuid/UuidGenerator.java

Lines changed: 53 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,68 @@ public UuidGenerator(Class<?> memberType) {
5656
public UuidGenerator(
5757
org.hibernate.annotations.UuidGenerator config,
5858
MemberDetails memberDetails) {
59-
generator = determineValueGenerator( config, memberDetails );
59+
generator = determineValueGenerator( config, memberDetails.getDeclaringType().getName(), memberDetails.getName() );
6060

6161
final Class<?> memberType = memberDetails.getType().determineRawClass().toJavaClass();
6262
valueTransformer = determineProperTransformer( memberType );
6363
}
6464

65+
@Internal
66+
public UuidGenerator(
67+
org.hibernate.annotations.UuidGenerator config,
68+
Member idMember) {
69+
generator = determineValueGenerator( config, idMember.getDeclaringClass().getName(), idMember.getName() );
70+
71+
final Class<?> propertyType = getPropertyType( idMember );
72+
this.valueTransformer = determineProperTransformer( propertyType );
73+
}
74+
75+
public UuidGenerator(
76+
org.hibernate.annotations.UuidGenerator config,
77+
Member member,
78+
GeneratorCreationContext creationContext) {
79+
this( config, member );
80+
}
81+
82+
/**
83+
* @return {@link EventTypeSets#INSERT_ONLY}
84+
*/
85+
@Override
86+
public EnumSet<EventType> getEventTypes() {
87+
return INSERT_ONLY;
88+
}
89+
90+
@Override
91+
public Object generate(SharedSessionContractImplementor session, Object owner, Object currentValue, EventType eventType) {
92+
return valueTransformer.transform( generator.generateUuid( session ) );
93+
}
94+
95+
@Internal
96+
public UuidValueGenerator getValueGenerator() {
97+
return generator;
98+
}
99+
100+
@Internal
101+
public ValueTransformer getValueTransformer() {
102+
return valueTransformer;
103+
}
104+
65105
private static UuidValueGenerator determineValueGenerator(
66106
org.hibernate.annotations.UuidGenerator config,
67-
MemberDetails memberDetails) {
107+
String memberDeclaringClassName,
108+
String memberName) {
68109
if ( config != null ) {
110+
// there is an annotation
69111
if ( config.algorithm() != UuidValueGenerator.class ) {
112+
// the annotation specified a custom algorithm
70113
if ( config.style() != AUTO ) {
71114
throw new MappingException(
72115
String.format(
73116
Locale.ROOT,
74117
"Style [%s] should not be specified with custom UUID value generator : %s.%s",
75118
config.style().name(),
76-
memberDetails.getDeclaringType().getName(),
77-
memberDetails.getName()
119+
memberDeclaringClassName,
120+
memberName
78121
)
79122
);
80123
}
@@ -83,46 +126,21 @@ private static UuidValueGenerator determineValueGenerator(
83126
if ( config.style() == TIME ) {
84127
return new CustomVersionOneStrategy();
85128
}
86-
else if ( config.style() == VERSION_6 ) {
129+
if ( config.style() == VERSION_6 ) {
87130
return UuidVersion6Strategy.INSTANCE;
88131
}
89-
else if ( config.style() == VERSION_7 ) {
132+
if ( config.style() == VERSION_7 ) {
90133
return UuidVersion7Strategy.INSTANCE;
91134
}
135+
// NOTE : AUTO falls through
92136
}
93137

138+
// Either -
139+
// 1. there is no annotation
140+
// 2. the annotation specified AUTO (with no custom algorithm)
94141
return StandardRandomStrategy.INSTANCE;
95142
}
96143

97-
@Internal
98-
public UuidGenerator(
99-
org.hibernate.annotations.UuidGenerator config,
100-
Member idMember) {
101-
if ( config.algorithm() != UuidValueGenerator.class ) {
102-
if ( config.style() != AUTO ) {
103-
throw new MappingException(
104-
String.format(
105-
Locale.ROOT,
106-
"Style [%s] should not be specified with custom UUID value generator : %s.%s",
107-
config.style().name(),
108-
idMember.getDeclaringClass().getName(),
109-
idMember.getName()
110-
)
111-
);
112-
}
113-
generator = instantiateCustomGenerator( config.algorithm() );
114-
}
115-
else if ( config.style() == TIME ) {
116-
generator = new CustomVersionOneStrategy();
117-
}
118-
else {
119-
generator = StandardRandomStrategy.INSTANCE;
120-
}
121-
122-
final Class<?> propertyType = getPropertyType( idMember );
123-
this.valueTransformer = determineProperTransformer( propertyType );
124-
}
125-
126144
private static UuidValueGenerator instantiateCustomGenerator(Class<? extends UuidValueGenerator> algorithmClass) {
127145
try {
128146
return algorithmClass.getDeclaredConstructor().newInstance();
@@ -147,34 +165,4 @@ private ValueTransformer determineProperTransformer(Class<?> propertyType) {
147165

148166
throw new HibernateException( "Unanticipated return type [" + propertyType.getName() + "] for UUID conversion" );
149167
}
150-
151-
public UuidGenerator(
152-
org.hibernate.annotations.UuidGenerator config,
153-
Member member,
154-
GeneratorCreationContext creationContext) {
155-
this(config, member);
156-
}
157-
158-
/**
159-
* @return {@link EventTypeSets#INSERT_ONLY}
160-
*/
161-
@Override
162-
public EnumSet<EventType> getEventTypes() {
163-
return INSERT_ONLY;
164-
}
165-
166-
@Override
167-
public Object generate(SharedSessionContractImplementor session, Object owner, Object currentValue, EventType eventType) {
168-
return valueTransformer.transform( generator.generateUuid( session ) );
169-
}
170-
171-
@Internal
172-
public UuidValueGenerator getValueGenerator() {
173-
return generator;
174-
}
175-
176-
@Internal
177-
public ValueTransformer getValueTransformer() {
178-
return valueTransformer;
179-
}
180168
}

0 commit comments

Comments
 (0)