BAEL-2900 Persisting enums in JPA (#6958)
This commit is contained in:
parent
ef91212d4c
commit
0d24260e9b
|
@ -0,0 +1,91 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
@Entity
|
||||
public class Article {
|
||||
|
||||
@Id
|
||||
private int id;
|
||||
|
||||
private String title;
|
||||
|
||||
@Enumerated(EnumType.ORDINAL)
|
||||
private Status status;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
private Type type;
|
||||
|
||||
@Basic
|
||||
private int priorityValue;
|
||||
|
||||
@Transient
|
||||
private Priority priority;
|
||||
|
||||
private Category category;
|
||||
|
||||
public Article() {
|
||||
}
|
||||
|
||||
@PostLoad
|
||||
void fillTransient() {
|
||||
if (priorityValue > 0) {
|
||||
this.priority = Priority.of(priorityValue);
|
||||
}
|
||||
}
|
||||
|
||||
@PrePersist
|
||||
void fillPersistent() {
|
||||
if (priority != null) {
|
||||
this.priorityValue = priority.getPriority();
|
||||
}
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Status status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(Type type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public Priority getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public void setPriority(Priority priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
public Category getCategory() {
|
||||
return category;
|
||||
}
|
||||
|
||||
public void setCategory(Category category) {
|
||||
this.category = category;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public enum Category {
|
||||
SPORT("S"), MUSIC("M"), TECHNOLOGY("T");
|
||||
|
||||
private String code;
|
||||
|
||||
Category(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
import javax.persistence.AttributeConverter;
|
||||
import javax.persistence.Converter;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Converter(autoApply = true)
|
||||
public class CategoryConverter implements AttributeConverter<Category, String> {
|
||||
@Override
|
||||
public String convertToDatabaseColumn(Category category) {
|
||||
if (category == null) {
|
||||
return null;
|
||||
}
|
||||
return category.getCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Category convertToEntityAttribute(final String code) {
|
||||
if (code == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Stream.of(Category.values())
|
||||
.filter(c -> c.getCode().equals(code))
|
||||
.findFirst()
|
||||
.orElseThrow(IllegalArgumentException::new);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public enum Priority {
|
||||
LOW(100), MEDIUM(200), HIGH(300);
|
||||
|
||||
private int priority;
|
||||
|
||||
private Priority(int priority) {
|
||||
this.priority = priority;
|
||||
}
|
||||
|
||||
public int getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public static Priority of(int priority) {
|
||||
return Stream.of(Priority.values())
|
||||
.filter(p -> p.getPriority() == priority)
|
||||
.findFirst()
|
||||
.orElseThrow(IllegalArgumentException::new);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
public enum Status {
|
||||
OPEN, REVIEW, APPROVED, REJECTED;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
enum Type {
|
||||
INTERNAL, EXTERNAL;
|
||||
}
|
|
@ -26,6 +26,8 @@
|
|||
<persistence-unit name="jpa-h2">
|
||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||
<class>com.baeldung.jpa.stringcast.Message</class>
|
||||
<class>com.baeldung.jpa.enums.Article</class>
|
||||
<class>com.baeldung.jpa.enums.CategoryConverter</class>
|
||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||
<properties>
|
||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
||||
|
@ -146,4 +148,4 @@
|
|||
</properties>
|
||||
</persistence-unit>
|
||||
|
||||
</persistence>
|
||||
</persistence>
|
|
@ -0,0 +1,118 @@
|
|||
package com.baeldung.jpa.enums;
|
||||
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.Persistence;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class ArticleUnitTest {
|
||||
|
||||
private static EntityManager em;
|
||||
private static EntityManagerFactory emFactory;
|
||||
|
||||
@BeforeClass
|
||||
public static void setup() {
|
||||
Map properties = new HashMap();
|
||||
properties.put("hibernate.show_sql", "true");
|
||||
properties.put("hibernate.format_sql", "true");
|
||||
emFactory = Persistence.createEntityManagerFactory("jpa-h2", properties);
|
||||
em = emFactory.createEntityManager();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldPersistStatusEnumOrdinalValue() {
|
||||
// given
|
||||
Article article = new Article();
|
||||
article.setId(1);
|
||||
article.setTitle("ordinal title");
|
||||
article.setStatus(Status.OPEN);
|
||||
|
||||
// when
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
em.persist(article);
|
||||
tx.commit();
|
||||
|
||||
// then
|
||||
Article persistedArticle = em.find(Article.class, 1);
|
||||
|
||||
assertEquals(1, persistedArticle.getId());
|
||||
assertEquals("ordinal title", persistedArticle.getTitle());
|
||||
assertEquals(Status.OPEN, persistedArticle.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldPersistTypeEnumStringValue() {
|
||||
// given
|
||||
Article article = new Article();
|
||||
article.setId(2);
|
||||
article.setTitle("string title");
|
||||
article.setType(Type.EXTERNAL);
|
||||
|
||||
// when
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
em.persist(article);
|
||||
tx.commit();
|
||||
|
||||
// then
|
||||
Article persistedArticle = em.find(Article.class, 2);
|
||||
|
||||
assertEquals(2, persistedArticle.getId());
|
||||
assertEquals("string title", persistedArticle.getTitle());
|
||||
assertEquals(Type.EXTERNAL, persistedArticle.getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldPersistPriorityIntValue() {
|
||||
// given
|
||||
Article article = new Article();
|
||||
article.setId(3);
|
||||
article.setTitle("callback title");
|
||||
article.setPriority(Priority.HIGH);
|
||||
|
||||
// when
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
em.persist(article);
|
||||
tx.commit();
|
||||
|
||||
// then
|
||||
Article persistedArticle = em.find(Article.class, 3);
|
||||
|
||||
assertEquals(3, persistedArticle.getId());
|
||||
assertEquals("callback title", persistedArticle.getTitle());
|
||||
assertEquals(Priority.HIGH, persistedArticle.getPriority());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldPersistCategoryEnumConvertedValue() {
|
||||
// given
|
||||
Article article = new Article();
|
||||
article.setId(4);
|
||||
article.setTitle("converted title");
|
||||
article.setCategory(Category.MUSIC);
|
||||
|
||||
// when
|
||||
EntityTransaction tx = em.getTransaction();
|
||||
tx.begin();
|
||||
em.persist(article);
|
||||
tx.commit();
|
||||
|
||||
// then
|
||||
Article persistedArticle = em.find(Article.class, 4);
|
||||
|
||||
assertEquals(4, persistedArticle.getId());
|
||||
assertEquals("converted title", persistedArticle.getTitle());
|
||||
assertEquals(Category.MUSIC, persistedArticle.getCategory());
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue