1

我是 Spring 新手,正在尝试使用 Spring 数据创建六边形架构

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

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

但是我不想在课堂上添加注释。persistence我已经在包中的 hibernate.cfg.xml 和 Customer.hbm.xml 中设置了实体。

我认为 spring boot 没有使用其他包中的 hibernate.cfg.xml 。

有什么方法可以配置 Spring Boot 以根据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包的资源中。

4

2 回答 2

1

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

一些备注

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

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

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

于 2020-05-02T09:30:48.437 回答
0

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

于 2020-05-07T08:22:27.560 回答