【问题标题】:Spring Data - hibernate.cfg.xml in different packageSpring Data - 不同包中的 hibernate.cfg.xml
【发布时间】:2020-05-01 05:42:33
【问题描述】:

我是 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 包的资源中。

【问题讨论】:

    标签: hibernate kotlin spring-data domain-driven-design hexagonal-architecture


    【解决方案1】:

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

    一些说明

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

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

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

    【讨论】:

    • 原来关键是拥有META-INF/orm.xml。如果该文件存在,则将读取休眠 xml 映射,并且我会假设任何 JPA 映射也会。我现在同意注释可能是最实用的解决方案,特别是因为大多数文档和示例都使用它们。唯一的问题是它们描述了域内特定于存储的问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 2023-03-12
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2020-08-18
      • 2020-03-07
      • 1970-01-01
      相关资源
      最近更新 更多