hibernate - Spring Data - 不同包中的 hibernate.cfg.xml

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

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

最佳答案

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

一些备注

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

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

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

关于hibernate - Spring Data - 不同包中的 hibernate.cfg.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61537413/

相关文章:

java - 使用 JpaRepository 注入(inject) Autowiring 依赖项失败

java - Hibernate - 将 orderBy() 添加到 DetachedCriteria 如果不存在?

android - 带有 Kotlin 的 Android Studio 中相关 XML 文件的多个装订线图标

java - 没有为 feign 客户端找到类型类 kotlin.Unit 的后备实例

java - 使用 Spring Data 时是否需要手动设置服务器端关系?

java - 如何防止客户端应用程序中重复的 EntityManager 事务代码(打开、提交、关闭)?

java - 如何使用 Hibernate 从 CREATE 语句解析表名?

java - 使用 URL 字符串进行 API 调用的更好方法

java - CrudRepository OperationNotSupported

hibernate - 关于 EntityManagerFactory 和 SessionFactory 与 Hibernate 5.3、Spring Data JPA 2.1.4 和 Spring 5.1 的混淆