About two years ago I blogged on this combination: Enums - all the way to persistence. Technology is moving at faster pace than ever before. Java's release cadence is moving at rapid 6 months cycle, every March and September. Spring boot catches Java and other technologies and moves along at the same pace as Java, every 6 months in May and November. Of course, the PostgreSQL database, Hibernate and even Maven build system keep moving as well, at their own pace.
The challenge for Java developer is to keep up with all the moving technologies. As software development requires talented developers with years of experience and knowledge, debates go on Artificial Intelligence (AI). Some who have moved away from coding strongly feel that the generative AI which currently is capable of generating even code will replace software developers. I don't believe in that, at least at this time. The add-on 'at least at this time' is only a cautious extension to that non-generative human statement). I have tried CodeGPT lately at work, a couple of times when I was stuck with things not working together as described in documentations and blog posts, asking it's generative trained intelligence to see if it would be able to be my copilot in those development situations. It couldn't really stand up the hype in anyway, and I had to go and figure out myself all those situations.
Enums persistence - is one such problem again I did hit roadblocks lately after two years. The only change is newer versions of all of these technologies. It required additional exploration of few things before arriving at a solution that worked eventually.
Environment: Java 21, Spring Boot 3.2.3, PostgreSQL 15.3, maven 3.9.6 on macOS Catalina 10.15.7
Spring boot 3.2.3 data jpa brings in Hibernate 6.4.4 dependency.
The same persistent model described in my earlier blog post: Enums - all the way to persistence would need the following changes for enums to work.
The DDL script requires an extra PostgreSQL casting as shown below for enums:
-- create enum type genders
CREATE TYPE genders AS ENUM(
'MALE', 'FEMALE'
);
CREATE CAST (varchar AS genders) WITH INOUT AS IMPLICIT;
In maven pom.xml, the spring boot version is 3.2.3 and the hibernate-types-55 dependency is not needed.
Changes to domain object Person.java are shown below (the @TypeDef annotation is not required):
...
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
...
@NotNull
@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
Gender gender;
...
}
Changes look simple after figuring out and making things to work, but finding things that work required a bit of exploration ;)
References
- PostgreSQL Enumerated Types
- PostgreSQL CREATE CAST
- Spring Boot 3, Hibernate 6 enum mapping issue - stackoverflow
- The hypersistence-utils library
- PostgreSQL pg_cast
- PostgreSQL pg_cast catalog
- Baeldung - persisting enums in Java
No comments:
Post a Comment