Spring 数据 Jdbc - 将内部 class 映射到 table 列
Spring Data Jdbc - map inner class to table column
使用 Spring Data JDBC 我希望将内部变量 'inner' 映射到外部 table 中的 varchar 列,而不是映射到它自己的 table .这可能吗?
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);
}
}
}
根据此文档,无法在实体中使用内部 class。
Entity Class Requirements A portable JPA entity class:
should be a top-level class (i.e. not a nested / inner class). should
have a public or protected no-arg constructor. cannot be final and
cannot have final methods or final instance variables.
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/
是的,这是可能的。
您需要提供从 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。
使用 Spring Data JDBC 我希望将内部变量 'inner' 映射到外部 table 中的 varchar 列,而不是映射到它自己的 table .这可能吗?
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);
}
}
}
根据此文档,无法在实体中使用内部 class。
Entity Class Requirements A portable JPA entity class:
should be a top-level class (i.e. not a nested / inner class). should have a public or protected no-arg constructor. cannot be final and cannot have final methods or final instance variables.
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/
是的,这是可能的。
您需要提供从 Inner
到 String
和返回的转换器。
在您的应用程序上下文配置中为 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。