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);
}
}