Spring Data Jdbc - сопоставить внутренний класс со столбцом таблицы - PullRequest
0 голосов
/ 13 ноября 2018

Использование Spring Data JDBC Я бы хотел, чтобы внутренняя переменная 'inner' отображалась в столбец varchar во внешней таблице, а не в свою собственную таблицу. Это возможно?

public class Outer {
    @Id
    private String id;
    private Inner inner;
}

...

public class Inner {
   private String value;
}

...

public OuterRepository implements CrudRepository<Outer, String> {}

Вот моя конфигурация контекста:

@Configuration
@EnableJdbcRepositories
public class Config extends JdbcConfiguration {

    @Bean
    protected JdbcCustomConversions jdbcCustomConversions() {
        return new JdbcCustomConversions(asList(StringToInner.INSTANCE, InnerToString.INSTANCE));
    }

    @WritingConverter
    enum InnerToString implements Converter<Inner, String> {

        INSTANCE;

        @Override
        public String convert(Inner source) {
            return source.getValue();
        }
    }

    @ReadingConverter
    enum StringToInner implements  Converter<String, Inner> {

        INSTANCE;

        @Override
        public Inner convert(String source) {
            return new Inner(source);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Да, это возможно. Вам необходимо предоставить конвертеры от Inner до String и обратно.

В вашей конфигурации контекста приложения зарегистрируйте bean-компонент для jdbcCustomConversions:

@Bean
CustomConversions jdbcCustomConversions() {
    return new JdbcCustomConversions(asList(InnerToString.INSTANCE, StringToInner.INSTANCE));
}

Определите ссылочные преобразователи следующим образом:

@WritingConverter
enum InnerToString implements Converter<Inner, String> {

    INSTANCE;

    @Override
    public String convert(Inner inner) {

        return inner == null ? null : inner.value;
    }
}

@ReadingConverter
enum StringToInner implements Converter<String, Inner> {

    INSTANCE;

    @Override
    public Inner convert(String source) {

        Inner inner = new inner();
        inner.value = source;
        return inner;
    }
}

Преобразователи не должны быть перечислениями, но нет смысла иметь более одного экземпляра, если преобразователь не параметризован.

Аннотации @WritingConverter и @ReadingConverter важны, поскольку они контролируют, используются ли конвертеры при записи в базу данных или чтении из базы данных.

Обратите внимание, что это работает для классов, которые хранятся в одном столбце. Правильные встроенные объекты, которые отображаются в списке столбцов, пока не поддерживаются. См. DATAJDBC-111 .

0 голосов
/ 13 ноября 2018

Согласно этой документации невозможно использовать внутренний класс в сущности.

Требования к классу сущностей Переносимый класс сущностей JPA:

должен быть верхнего уровнякласс (т.е. не вложенный / внутренний класс) .должен иметь открытый или защищенный конструктор без аргументов.не может быть окончательным и не может иметь окончательных методов или конечных переменных экземпляра.

https://www.objectdb.com/java/jpa/entity/types

Но вы можете проверить аннотацию @Embeddable, вот пример https://www.callicoder.com/hibernate-spring-boot-jpa-embeddable-demo/ https://springframework.guru/embedded-jpa-entities-under-spring-boot-and-hibernate-naming/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...