tablas relacionadas relacion programacion obtener muchos hasmany español datos consultas belongsto string hibernate arraylist

string - relacionadas - orm de laravel



Convertir lista en entidad a columna de cadena única en la base de datos (2)

Tengo un campo VARCHAR en mi base de datos, y el valor de este campo es val1,val2,val3 .

¿Es posible establecer esto en un atributo ArrayList<String> de una entidad que utiliza coma como delimitador dividido?


Sí, esto es posible.

Con Hibernate 4.3.x + puede definir un AttributeConverter aunque estoy bastante seguro de que esto no funcionará para las primeras versiones de Hibernate debido al tipo de List . Ver esto para un ejemplo: http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

La otra forma de hacer que esto funcione es implementar un UserType personalizado y anotar el campo / getter con org.hibernate.annotations.Type . Aquí hay una buena redacción de esto con ejemplos: http://blog.xebia.com/understanding-and-writing-hibernate-user-types/

Sin embargo, otra forma que es compatible con JPA es tener dos campos, la List anotada con javax.persistence.Transient y la String pero luego usted mismo debe administrar la sincronización de estado entre estos dos campos en los oyentes PrePersist y PreUpdate . Aquí un ejemplo para usar oyentes: http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/


Si usa JPA 2.1, puede crear un AttributeConverter :

@Converter public class StringListConverter implements AttributeConverter<List<String>, String> { @Override public String convertToDatabaseColumn(List<String> list) { // Java 8 return String.join(",", list); // Guava return Joiner.on('','').join(list); } @Override public List<String> convertToEntityAttribute(String joined) { return new ArrayList<>(Arrays.asList(joined.split(","))); } }

Puedes usar este convertidor en tu entidad:

@Column @Convert(converter = StringListConverter.class) private List<String> strings;

Antes de JPA 2.1, puedes hacer esto a mano:

@Entity private MyEntity { ... private String strings; public List<String> getStrings() { return Arrays.asList(strings.split(",")); } public void setStrings(List<String> list) { strings = String.join(",", list); } }