0

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

4

3 回答 3

4

你是正确的 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 )

于 2019-01-21T12:38:51.300 回答
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;
    }

}

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

来自Idspring-data-commons。

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

检查在 Spring 5.3 和 Spring Data R2dbc 中更新的 R2dbc 示例。

但遗憾的是,目前 Spring data r2dbc 不支持继承和保护。

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

于 2020-10-05T09:18:14.457 回答
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;
  ...
}

当您希望链接被映射时,您可以使用延迟加载或连接选择。

如果使用findBy...Spring 存储库的方法(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 实例,以及从数据库一起加载的链接列表。

于 2020-12-01T17:23:27.737 回答