Spring数据-hibernate.cfg.xml在不同的包中
我是Spring新手,正在尝试用Spring数据创建一个六边形架构 我有一个gradle多模块设置,其中一个用于域,一个用于持久性,另一个用于配置,DddApplication就在这里 启动时,我得到的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
不是托管类型: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
}
}
}