【问题标题】:Spring Data Jdbc - map inner class to table columnSpring Data Jdbc - 将内部类映射到表列
【发布时间】:2019-04-16 09:51:55
【问题描述】:

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

【问题讨论】:

  • 我不认为这是 spring data jdbc 直接支持的东西,但也许你可以尝试为你的内部实例使用属性访问并手动处理分配它的字符串值。

标签: spring spring-boot spring-data spring-data-jdbc


【解决方案1】:

是的,这是可能的。 您需要提供从Inner 到String 并返回的转换器。

在您的应用程序上下文配置中为jdbcCustomConversions注册一个bean:

@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。

【讨论】:

  • 这正是我想要的,但我一定做错了,因为当我做respository.save(outer);:pastebin.com/BMiHsfTc 时出现以下错误
  • 它没有选择自定义转换。你能用你当前的上下文配置更新问题吗?
  • 我收到在类路径资源 [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] 中定义的 bean 'jdbcCustomConversions',无法注册。具有该名称的 bean 已在 my.pack .Main 中定义,并且覆盖已禁用。
  • 我正在尝试应用它,但我没有成功。更多详情在这里:stackoverflow.com/questions/70790593/…
【解决方案2】:

根据本文档,无法在实体中使用内部类。

实体类要求一个可移植的 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/

【讨论】:

  • 问题是关于 Spring Data JDBC,而不是 JPA。
  • 对不起,我的错
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 2021-09-21
  • 2021-09-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多