/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.converter.elementCollection; import static org.junit.Assert.assertEquals; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.persistence.AttributeConverter; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.Converter; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.Session; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; import org.junit.Test; /** * @author Steve Ebersole */ @TestForIssue(jiraKey = "HHH-8529") public class CollectionElementConversionTest extends BaseNonConfigCoreFunctionalTestCase { @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { Customer.class, ColorConverter.class }; } @Test public void testElementCollectionConversion() { Session session = openSession(); session.getTransaction().begin(); Customer customer = new Customer(); customer.id = 1; customer.set = new HashSet<Color>(); customer.set.add(Color.RED); customer.set.add(Color.GREEN); customer.set.add(Color.BLUE); customer.map = new HashMap<Color, Status>(); customer.map.put(Color.RED, Status.INACTIVE); customer.map.put(Color.GREEN, Status.ACTIVE); customer.map.put(Color.BLUE, Status.PENDING); session.persist(customer); session.getTransaction().commit(); session.close(); session = openSession(); session.getTransaction().begin(); assertEquals(customer.set, session.get(Customer.class, 1).set); assertEquals(customer.map, session.get(Customer.class, 1).map); session.getTransaction().commit(); session.close(); session = openSession(); session.getTransaction().begin(); customer = session.get(Customer.class, 1); session.delete(customer); session.getTransaction().commit(); session.close(); } @Entity @Table(name = "Customer") public static class Customer { @Id private Integer id; @ElementCollection @Column(name = "`set`") private Set<Color> set; @ElementCollection @Enumerated(EnumType.STRING) private Map<Color, Status> map; } public static class Color { public static Color RED = new Color(0xFF0000); public static Color GREEN = new Color(0x00FF00); public static Color BLUE = new Color(0x0000FF); private final int rgb; public Color(int rgb) { this.rgb = rgb; } @Override public int hashCode() { return this.rgb; } @Override public boolean equals(Object obj) { return obj instanceof Color && ((Color) obj).rgb == this.rgb; } } public static enum Status { ACTIVE, INACTIVE, PENDING } @Converter(autoApply = true) public static class ColorConverter implements AttributeConverter<Color, String> { @Override public String convertToDatabaseColumn(Color attribute) { return attribute == null ? null : Integer.toString(attribute.rgb, 16); } @Override public Color convertToEntityAttribute(String dbData) { return dbData == null ? null : new Color(Integer.parseInt(dbData, 16)); } } }