Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Storing UUID as string in mysql using JPA

I came across a blog of using UUID with Hibernate and MySql. Now the problem is, whenever I take a look at the database the ID's will be non-readable format (binary-16). How can I store UUID as a readable format like 7feb24af-fc38-44de-bc38-04defc3804fe instead of ¡7ôáßEN¹º}ÅÑs

I was using this code

@Id
@GeneratedValue( generator = "uuid2" )
@GenericGenerator( name = "uuid2", strategy = "uuid2" )
@Column( name = "id", columnDefinition = "BINARY(16)" )
private UUID id;

And the result is ¡7ôáßEN¹º}ÅÑs. But I want it as readable UUID so I used the following code which didn't help me

@Id
@GeneratedValue( generator = "uuid2" )
@GenericGenerator( name = "uuid2", strategy = "uuid2" )
@Column( name = "id", columnDefinition = "CHAR(32)" )
private UUID id;

How to save the UUID as a string instead of binary(16) without changing the java type UUID

like image 992
Sunil Rao Avatar asked Apr 24 '18 14:04

Sunil Rao


People also ask

Can a UUID be a string?

It's a UUID, stored in a String. The sixteen octets of a UUID are represented as 32 hexadecimal (base 16) digits, displayed in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters (32 alphanumeric characters and four hyphens - which can be stored in a String just fine.

How does MySQL store UUID?

In MySQL, you can store UUID values in a compact format ( BINARY ) and display them in human-readable format ( VARCHAR ) with help of the following functions: UUID_TO_BIN. BIN_TO_UUID. IS_UUID.

Can UUID be primary key?

UUIDs as primary key aren't a slam drunk, but do have some advantages: The fact that they're random means that they don't rely on a single sequence to be generated. Multiple entities can generate IDs independently, but still store them to a shared data store without clobbering each other.


2 Answers

just use @org.hibernate.annotations.Type(type="uuid-char")

There is three levels of data types:
- Java types
- Hibernate's types
- Database Specific types.

Hibernate data type presentation is a bridge between Java data type and Database types to be independent from database.

You can check this mappings. As you can find there java.util.UUID can be mapped to diferent types (binary or char/varchar). uuid-binary is key to hibernate's UUIDBinaryType, you get this type by default and it will be mapped to BINARY of your database.

If you want to get CHAR type under your UUID, you should explain to hibernate that you want his UUIDCharType. To do that you use uuid-char key and as you can check in JavaDoc of @Type annotation: Defines a Hibernate type mapping.. So, you use annotation to explain hibernate which bridge it should use.

like image 60
Ivan Osipov Avatar answered Sep 21 '22 17:09

Ivan Osipov


I had the same problem in my last project (spring-boot:2.5.3 + mariaDB).
So I added the following annotation @Type(type = "org.hibernate.type.UUIDCharType") to fix it.

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;

import javax.persistence.*;
import java.util.UUID;
/** imports */

@Entity()
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "uuid", columnDefinition = "char(36)")
    @Type(type = "org.hibernate.type.UUIDCharType")
    private UUID uuid;

   /** ... */
}

The purpose of the hibernate annotation @Type is to define the type of data stored in database and it's compatible with the previous line @Column(name = "uuid", columnDefinition = "char(36)")

While googling it, I noticed that mariaDB & MySQL have the same issue.

You can see here more examples in different use cases for org.hibernate.annotations.Type

like image 40
Radouane FADEL Avatar answered Sep 22 '22 17:09

Radouane FADEL