Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring数据-hibernate.cfg.xml在不同的包中_Hibernate_Kotlin_Spring Data_Domain Driven Design_Hexagonal Architecture - Fatal编程技术网

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

Spring数据-hibernate.cfg.xml在不同的包中,hibernate,kotlin,spring-data,domain-driven-design,hexagonal-architecture,Hibernate,Kotlin,Spring Data,Domain Driven Design,Hexagonal Architecture,我是Spring新手,正在尝试用Spring数据创建一个六边形架构 我有一个gradle多模块设置,其中一个用于域,一个用于持久性,另一个用于配置,DddApplication就在这里 启动时,我得到的不是托管类型:class com.example.ddd.domain.model.Customer,除非我用javax.persistence.@Entity等注释该类 但是,我不希望在类中使用注释。我在persistence包中的hibernate.cfg.xml和Customer.hbm.x

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

我有一个gradle多模块设置,其中一个用于域,一个用于持久性,另一个用于配置,DddApplication就在这里

启动时,我得到的
不是托管类型:class com.example.ddd.domain.model.Customer
,除非我用javax.persistence.@Entity等注释该类

但是,我不希望在类中使用注释。我在
persistence
包中的hibernate.cfg.xml和Customer.hbm.xml中设置了实体

我认为SpringBoot没有使用另一个包中的hibernate.cfg.xml

是否有任何方法可以配置Spring Boot,以基于
持久性
包中的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)
}

application.properties和hibernate.cfg.xml位于
persistence
包的参考资料中。

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

一些评论

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

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

这是代码简单性和应用六边形原则之间的折衷,因为XML orm文件比注释更难维护。
但是,这样的文件可以避免JPA注释污染您的域或在hexagon之外添加额外的JPA实体层。

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

结果证明关键是要有
META-INF/orm.xml
。如果该文件存在,那么HibernateXML映射将被读取,我假设任何JPA映射也会被读取。我现在同意,无论如何,注释可能是最实用的解决方案,特别是因为大多数文档和示例都使用它们。唯一的问题是,它们描述了域内特定于存储的问题。
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
        }
    }
}