反应性应用程序的ORM框架

时间:2019-01-19 10:57:09

标签: spring-data reactive-programming r2dbc spring-data-r2dbc

我一直在寻找spring-data-r2dbc进行反应式数据库访问。但是,似乎没有提供任何ORM支持,如项目页面所述,它不是ORM框架。存在或计划在响应式应用程序中支持ORM的哪些选项?对于今天,为字段指定列名(JPA中的@Column),使用类层次结构(JPA中的@MappedSuperclass)以及最重要的是在使用spring-data-r2dbc时进行联接的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您正确的说,spring-data-r2dbc不是ORM。它不会映射数据库中的关系。它可以做的是将数据库行映射到对象。下面的示例代码片段被映射到下面的数据库行:

Kotlin中的示例类:

@Table("song")
class SongRow(
    @Id val id: Long, 
    val name: String, 
    val artist: Long
)

行:

create table song(
    id integer identity primary key,
    artist integer references artist(id),
    name varchar(100) NOT NULL,
);

有关列自动映射到模型的方式,请参见:https://docs.spring.io/spring-data/r2dbc/docs/1.0.0.M1/reference/html/#mapping-usage

在上面的链接中也提到,您可以使用@Column。

关于您的问题之一:

  

存在或计划支持反应式ORM的选项   应用程序?   我不知道

至:

  

在使用spring-data-r2dbc时加入

使用@Query批注可以执行联接。如果要实际映射通过联接获取的数据,最好使用DatabseClient(请参见https://docs.spring.io/spring-data/r2dbc/docs/1.0.0.M1/reference/html/#r2dbc.datbaseclient

答案 1 :(得分:1)

Spring Data R2dbc可被视为轻量级 ORM框架。

映射规则可以在实体类中定义。

@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "posts")
public class Post {

    @Id
    @Column("id")
    private UUID id;

    @Column("title")
    private String title;

    @Column("content")
    private String content;

    @JsonSerialize(using = PgJsonObjectSerializer.class)
    @JsonDeserialize(using = PgJsonObjectDeserializer.class)
    @Column("metadata")
    private Json metadata;

    @Column("status")
    private Status status;

    @Column("created_at")
    @CreatedDate
    private LocalDateTime createdAt;

    @Column("updated_at")
    @LastModifiedDate
    private LocalDateTime updatedAt;

    @Column("version")
    @Version
    private Long version;

    enum Status {
        DRAFT, PENDING_MODERATION, PUBLISHED;
    }

}

@Column@Table来自spring-data-relational项目,该项目在spring-data-r2dbc和spring-data-jdbc之间共享。

Id来自spring-data-commons。

Spring Data R2dbc提供R2dbcEntityTemplate(类似于JdbcTemplate)和R2dbcRepository(R2dbc特定的Repository)。 Spring 5.3提供了重构的DatabaseClient

my updated example中检查Spring 5.3和Spring Data R2dbc中的R2dbc。

但是不幸的是,当前,Spring数据r2dbc不支持继承和保护。

如果您坚持使用JPA / Hibernate,请检查Hibernate Rx,这是Hibernate的反应式实现。

答案 2 :(得分:0)

也许lc-spring-data-r2dbc可以完成这项工作,但是您找不到JPA的所有功能。在等待Hibernate Reactive释放并集成到Spring Data中时可能会有所帮助。

例如,您可以这样声明链接:

@Table
public class TableWithForeignKey {
  ...
  @ForeignKey(optional = false)
  private LinkedTable myLink;
  ...
}

@Table
public class LinkedTable {
  ...
  @ForeignTable(joinkey = "myLink")
  private List<TableWithForeignKey> links;
  ...
}

要映射链接时,可以使用延迟加载或通过连接进行选择。

如果您使用Spring存储库中的方法findBy...(findById,findAll ...),则只会加载存储库中的表。在这种情况下,您可以使用延迟加载。为此,您需要使用默认主体声明一个方法,并且该方法将自动实现:

  public Flux<TableWithForeignKey> lazyGetLinks() {
    return null; // will be implemented
  }

另一种方法是直接在请求中进行联接。当前不支持在存储库中自动进行联接(如JPA中的@EntitiGraph),但是您可以实现以下方法:

public interface MyRepository extends LcR2dbcRepository<LinkedTable, Long> {
  
  default Flux<LinkedTable> findAllAndJoin() {
    SelectQuery.from(LinkedTable.class, "root") // SELECT FROM LinkedTable AS root
      .join("root", "links", "link")            // JOIN root.links AS link
      .execute(getLcClient());                  // execute the select and map entities
  }

}

结果将是所有LinkedTable实例,以及从数据库中一起加载的链接列表。

相关问题