2015-12-02 13 views

Odpowiedz

32

Jeśli używasz JPA 2.1, można tworzyć 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(","))); 
    } 

} 

Można używać tego konwertera w swojej jednostki:

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

Dla zanim JPA 2.1 można to zrobić ręcznie :

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

I owinąć Arrays.asList w ArrayList w CON verter, ponieważ wynik jest przechowywany w atrybucie i każda zmiana na tej liście zostanie zapisana z powrotem do bazy danych - potrzebuję zatem listy wymiennej (nie mogę dodać niczego do wyniku Arrays.asList). W przypadku rozwiązania przed wynikiem 2.1 wynik nie jest połączony z atrybutem, a zmienna lista nie byłaby zsynchronizowana z atrybutem.

4

Tak, jest to możliwe.

Dzięki Hibernate 4.3.x + można zdefiniować AttributeConverter, chociaż jestem pewien, że nie będzie to działać we wczesnych wersjach Hibernacji ze względu na typ List. Zobacz na przykład: http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

Innym sposobem wykonania tej pracy jest zaimplementowanie niestandardowego UserType i opisanie pola/odbiorcy za pomocą org.hibernate.annotations.Type. Oto miły napisać tego przykłady: http://blog.xebia.com/understanding-and-writing-hibernate-user-types/

Jeszcze innym sposobem, który jest JPA kompatybilny jest mieć dwa pola, List uwagami z javax.persistence.Transient i String ale wtedy trzeba zarządzać synchronizacji stanu pomiędzy tymi dwoma polu PrePersist i PreUpdate samemu. Oto przykład użycia słuchaczy: http://alexandregama.org/2014/03/23/entity-listeners-and-callback-methods-jpa/