Как конвертировать объединенную коллекцию элементов с помощью JPA 2.1?

1

У меня 3 user таблицы, user_team и team...

user
--------
id (number)
name (varchar)

team
--------
name (varchar)

user_team
--------
user_id (number) FK -> user.id
team_name (varchar) FK -> team.name

и я хочу загрузить User объект, чтобы команды были преобразованы в правильный тип.

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue( strategy = IDENTITY )
    private Long id;

    @Column( name = "name" )
    private String name;

    @ElementCollection
    @JoinTable( name = "user_team", 
            joinColumns = @JoinColumn( name = "user_id" ) )
    @Column( name = "team_name" )
    @Convert( converter = TeamToStringConverter.class )
    private Set<Team> teams;
}

public enum Team { NOTEAM, GEEKS, FREAKS, etc ... }

@Converter
public class TeamToStringConverter implements AttributeConverter<Team, String> {

    @Override
    public String convertToDatabaseColumn( Team value ) {
        return value == null ? NOTEAM.name() : value.name();
    }
    @Override
    public TEAM convertToEntityAttribute( String value ) {
        return Team.from( value );
    }
}

Я думаю, проблема заключается в том, что он использует TeamToStringConverter для преобразования поля user_team.user_id вместо поля user_team.team_name (указанного в аннотации @Column), и результатом является исключение:

sql.SqlUtils - Attempted to convert SQLException to SQLException. Leaving it alone. [SQLState: null; errorCode: 0]
com.microsoft.sqlserver.jdbc.SQLServerException: An error occurred while converting the nvarchar value to JDBC data type INTEGER.
at com.microsoft.sqlserver.jdbc.DDC.convertStreamToObject(DDC.java:475)
at com.microsoft.sqlserver.jdbc.ServerDTVImpl.getValue(dtv.java:2536)
...
Caused by: java.lang.NumberFormatException: For input string: "NOTEAM"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
...
Теги:
entity-framework
jpa

1 ответ

2
Лучший ответ

Измените отображение на

@ElementCollection
@CollectionTable( name = "user_team", 
        joinColumns = @JoinColumn( name = "user_id" ) )
@Column( name = "team_name" )
@Enumerated(EnumType.STRING)
@Convert( converter = TeamToStringConverter.class )
private Set<Team> teams;

@CollectionTable следует использовать вместо @JoinTable, а @Enumerated(EnumType.STRING) сообщает JPA, что значения перечисления сохраняются как String в базе данных вместо Integer который является значением по умолчанию (индекс константы перечисления).

Обратите внимание, что team таблицы не имеет никакого значения для JPA в этой настройке, потому что она не сопоставляется ни с чем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню