Spring Data - hibernate.cfg. xml в другой упаковке - PullRequest
1 голос
/ 01 мая 2020

Я новичок в Spring и пытаюсь создать гексагональную архитектуру с данными Spring

У меня есть многомодульная установка с включенным пакетом для домена, одна для постоянства, а другая для конфигурации, где живет DddApplication.

При запуске я получаю Not a managed type: class com.example.ddd.domain.model.Customer, если я не аннотирую класс с помощью javax.persistence. @ Entity et c.

Однако я не хочу аннотаций в классе. Я настроил сущности в hibernate.cfg. xml и Customer.hbm. xml в пакете persistence.

Я думаю, что при весенней загрузке не используется hibernate.cfg. xml из другой пакет.

Можно ли каким-то образом настроить Spring Boot для распознавания объектов на основе hibernate.cfg. xml в пакете persistence?

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.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы можете посмотреть на этот ответ и прикрепленные фрагменты кода здесь . Идея состоит в том, чтобы заставить spring-data использовать конфигурационный файл orm. xml, в котором вы можете определить свои JPA-объекты.

Некоторые замечания

Единственное здесь вас беспокоят аннотации JPA. Эти аннотации представляют собой декларативный способ указать, что ваши доменные объекты (сущности, типы значений) также могут рассматриваться как сущности JPA.

Возможно, вы соответствуете DDD, Шестиугольная архитектура & KISS принципы, позволяющие им находиться в вашем домене. Действительно, они не создают сильной зависимости от какой-либо технической структуры персистентности, такой как Hibernate; потому что они являются аннотациями, а также потому, что здесь требуется только jpa spe c library в качестве зависимости для вашего домена. Такие репозитории доменов могут быть позже реализованы с помощью чего-то другого, кроме Hibernate (No SQL, AWS S3, безотносительно ...), сохраняя эти аннотации в вашем домене.

Это компромисс между простотой кода и применение гексагонального принципа, так как XML файл orm выглядит более сложным для обслуживания по сравнению с аннотациями. Однако такой файл позволит избежать загрязнения аннотациями JPA вашего домена или добавления дополнительного слоя сущностей JPA вне шестиугольника.

Возможно, основная проблема заключается в том, как согласовать неизменность типов значений и JPA (без дополнительной JPA-инфраструктуры). слой объектов) Есть ресурсы, например, об этой статье и, возможно, более поздние ...

0 голосов
/ 07 мая 2020

Вы можете сделать это путем определения отображений, полей и т. Д. c в файле конфигурации XML ("orm. xml") вместо размещения аннотаций JPA в классе сущностей. Я не стал бы засорять сущность материалами JPA, поскольку JPA - это постоянство, это технология, и она должна быть в адаптере за пределами шестиугольника.

...