Spring 数据 - hibernate.cfg.xml 在不同的包中

Spring Data - hibernate.cfg.xml in different package

我是 Spring 的新手,正在尝试使用 spring 数据

创建一个六边形架构

我有一个 gradle 多模块设置,其中包含用于域的包,一个用于持久性,另一个用于配置,DddApplication 所在的包。

启动时,我得到 Not a managed type: class com.example.ddd.domain.model.Customer,除非我用 javax.persistence.@Entity 等注释 class。

但是我不想要 class 中的注释。我在 persistence 包中的 hibernate.cfg.xml 和 Customer.hbm.xml 中设置了实体。

我认为 spring 引导没有使用来自其他包的 hibernate.cfg.xml。

有什么方法可以配置 Spring 引导识别基于 persistence 包中的 hibernate.cfg.xml 的实体?

package com.example.ddd.configuration

// ...

@SpringBootApplication
@EntityScan("com.example.ddd.domain.model")
@EnableJpaRepositories("com.example.ddd.persistence.repository")
class DddApplication {
    private val log: Logger = LoggerFactory.getLogger(DddApplication::class.java)

    @Bean
    fun loadData(repository: CustomerRepositoryJpa): CommandLineRunner? {
        return CommandLineRunner { args: Array<String?>? ->
//...
        }
    }
}

fun main(args: Array<String>) {
    runApplication<DddApplication>(*args)
}
package com.example.ddd.persistence.repository

//...

@Repository
interface CustomerRepositoryJpa : JpaRepository<Customer?, Long?> {}
package com.example.ddd.domain.model

open class Customer private constructor() {
    val id: Long? = null
    lateinit var firstName: String
    lateinit var lastName: String
    override fun toString(): String {
        return String.format("Customer[id=%d, firstName='%s', lastName='%s']", id,
                firstName, lastName)
    }

    companion object {
        fun new(firstName: String, lastName: String) : Customer {
            val e = Customer()
            e.firstName = firstName
            e.lastName = lastName
            return e
        }
    }
}

application.properties 和 hibernate.cfg.xml 在 persistence 包的资源中。

您可以查看此答案和附加的代码片段 here。 这个想法是让 spring-data 使用 orm.xml 配置文件,您可以在其中定义域对象 JPA 特性。

一些备注

这里唯一打扰您的是 JPA 注释。 这些注释是一种 声明性 方式来指示您的域对象(实体、值类型)也可以被视为 JPA 实体。

您可能会遵守 DDD、六边形架构和 KISS 原则,让它们驻留在您的域中。 实际上,它们不会对任何技术持久性框架(如 Hibernate)产生强烈的依赖性​​;因为它们是注释,也因为这里只需要 jpa spec library 作为域的依赖项。 这样的域存储库以后可以用 Hibernate 以外的东西(NoSQL、AWS S3 等等)来实现,将这些注释保留在你的域中。

这是代码简单性和六边形原则应用之间的权衡,因为 XML 与注释相比,orm 文件看起来更难维护。 然而,这样的文件将避免 JPA 注释污染您的域或在六边形之外添加额外的 JPA 实体层。

您可以在 XML 配置文件 ("orm.xml") 中定义映射、字段等,而不是将 JPA 注释放在实体 class 中。我不会用 JPA 的东西污染实体,因为 JPA 是关于持久性的,它是技术,它应该在六边形之外的适配器中。