如何为RDBMS和MongoDB创建公共实体?

时间:2018-06-03 18:11:57

标签: java spring mongodb jpa spring-data-jpa

我有一个与H2 RDBMS交互的Spring Boot RESTful服务。 我决定通过添加MongoDB支持来扩展它,并为每个数据源创建两个配置文件。

我的目的是使用通用实体,因此我开始将id字段从Long更改为BigInteger,因为如果我使用String作为{{1}它将导致SQL插入的性能问题。

id

当然还有相应的存储库。

@Document
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@EqualsAndHashCode
@ToString
public final class Book {

    @org.springframework.data.annotation.Id
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private BigInteger id;

    private String title;

    @ManyToOne(optional = false)
    private Author author;

}

我还通过用BIGDECIMAL替换BIGINT类型来修改H2表并重新填充我的表。我的属性中有public interface BookRepository extends CrudRepository<Book, BigInteger> {} ,并且抱怨Hibernate验证将spring.jpa.hibernate.ddl-aeuto=validate与来自db的java.math.BigInteger匹配。

毕竟,我调试了我的应用程序,但属于存储库的所有方法都返回空结果甚至BIGINT,但我看到记录显示在表中,findAll()返回所有记录。

你能澄清一些问题吗?

将JPA和MongoDB的实体组合在一个类中是一种好方法吗? Spring Data是否适用于BigInteger?任何提示?

更新: 我试图从头开始,我发现在使用@Document注释注释实体后,CRUD存储库开始出现行为异常,并且在注释@Query(native = true)的方法上使用org.springframework.data.mapping.PropertyReferenceException失败/ p>

1 个答案:

答案 0 :(得分:1)

我想您最好避免使用它,并创建两个完全不同的项目/分支。

在这种特殊情况下,您已经精心设计了RDBMS解决方案,但是要从MongoDB获得更多优势,您必须三思而行考虑文档/集合层次结构并考虑嵌套文档。

尝试避免在MongoDB中加入。它们非常昂贵