Kotlin JoinTable с дополнительными данными, не знаю, как сделать ссылку - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть немного сложный сценарий: у меня есть категории доходов, которые принадлежат арендатору, и организации, которые также принадлежат арендатору, и мне нужна таблица для сохранения некоторых данных для каждой комбинации организации / категории доходов. Я должен признать, что я скорее новичок в JPQL и ORM, чем просто старый SQL, так что это сводит меня с ума.

Итак, я почти уверен, что мне понадобится таблица соединений, но дело в том, что мне нужно сохранить некоторые дополнительные данные там. Сначала я построил столбец объединения вручную, используя orgId и rcId плюс это дополнительное значение, и теперь я не уверен, как отобразить это в Kotlin.

. Я создал класс модели для таблицы объединения, но Я не совсем уверен, что это путь к go, сейчас EntityManager дует с некоторым исключением NullPointer, когда я запускаю приложение. Моя цель состоит в том, чтобы мне нужно было извлечь это дополнительное значение из таблицы соединений на основе категории дохода и организации. Кроме того, составной ключ заставляет меня сомневаться в том, что класс Repository будет работать, или если мне понадобятся какие-то другие изменения.

Это моя текущая модель:

Organization.kt

package com.company.model

import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "tbl_organizations")
class Organization(
        @Id @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "organizationid")
        val id: Long,
        val name: String,
        val defaultCurrency: String,
        val countryCode: String,
        val language: String
)

RevenueCategory.kt

package com.company.model

import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "tbl_revenuecategory")
class RevenueCategory(
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "revenuecategoryid")
        var id: Long,

        @Column(name = "tenant_tenantid")
        var tenantId: Long,

        var name: String,
        var description: String,
        var postedToPms: Boolean,
        var revenueCategoryGroup: Int?=null
)

OrganizationRevenueCategory.kt

package com.letshare.pmsservice.model

import javax.persistence.*
import java.io.Serializable

@Entity
@Table(name = "tbl_organization_revenuecategory")
class OrganizationRevenueCategory(
        @EmbeddedId
        var id: OrganizationRevenueCategoryId? = null,

        var externalid: String? = null
) {

}

@Embeddable
class OrganizationRevenueCategoryId(
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "organization_organizationid")
        var organization: Organization,

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "revenuecategory_revenuecategoryid")
        var revenuecategory: RevenueCategory
): Serializable

OrganizationRevenueCategoryRepository.kt

package com.company.repository

import com.company.model.OrganizationRevenueCategory
import com.company.model.OrganizationRevenueCategoryId
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository

@Repository
interface OrganizationRevenueCategoryRepository : JpaRepository<OrganizationRevenueCategory, OrganizationRevenueCategoryId> {

    @Query("""SELECT orc 
                        FROM OrganizationRevenueCategory orc
                        JOIN RevenueCategory rc ON rc.id = orc.id.revenuecategoryid
                        WHERE rc.tenantId = :tenantId
                        AND orc.id = :revenueCategoryId
                        AND orc.id.organizationid = :organizationId""", nativeQuery = true)
    fun findCodeForTax(revenueCategoryId: Long, tenantId: Long, organizationId: Long): OrganizationRevenueCategory?

}

И это скрипт для создания таблицы .

СОЗДАТЬ ТАБЛИЦУ tbl_organization_revenuecategory (organization_organizationid bigint ССЫЛКИ tbl_organizations (organizationid), выручкаategory_revenuecategoryid bigint РЕФЕРЕНЦИИ tbl_revenuecategoryid (выручка категории) * выручка *, 10-й категории) с каждой организацией будут связаны все категории доходов арендатора, а каждая категория доходов будет связана со всеми организациями арендатора, мне кажется очевидным, что это много ко многим, но я кое-что упускаю. Получаемый NullPointer - это весь код Spring и Hibernate, без четких указаний на то, почему он сейчас ломается, но он, очевидно, работал до того, как я создал эту чудовищность для класса соединения.

Вот справочник по стекам:

2020-04-08 15: 13: 04,236 | главная | ОШИБКА | osboot.SpringApplication | Ошибка запуска приложения org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем 'entityManagerFactory', определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]: сбой вызова метода init; вложенное исключение java .lang.NullPointerException в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory java:. 1762) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory. java: 593) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory. java: 515) в org.springframework.Bean.Beang 1041 *: 320) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry. java: 222) в org.springframework.beans.factory.support.AbstractBeanFacte. ) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory. java: 199) в org.springframework.context.support.AbstractApplicationContext.getB ean (AbstractApplicationContext. java: 1105) в org.springframework.context.support. 1048 *: 549) в org.springframework.boot. web.servlet.context.ServletWebServerApplicationContext.refre sh (ServletWebServerApplicationContext. java: 142) в org.springframework.boot.SpringApplication.refre sh (SpringApplication. * 1052. SpringApplication.refreshContext (SpringApplication. java: 397) в org.springframework.boot.SpringApplication.run (SpringApplication. java: 316) в org.springframework.boot.SpringApplication.run (SpringApplication. java): в org.springframework.boot.SpringApplication.run (SpringApplication. java: 1248) в com.letshare.pmsservice.PmsServiceApplicationKt.main (PmsServiceApplication.kt: 19) в sun.reflect.NativeMethodAccessorImpl). .reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl. java: 62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl. java: 43) в java. : 498) в org.springframework.boot.loader.MainMethodRunner.run (MainMethodRunner. java: 48) в org.springframework.boot.loader.Launcher.launch (Launcher. java: 87) в org.springframework.boot.loader.Launcher.launch (Launcher. java: 50) в org.springframework.boot.loader. JarLauncher. AnnotationBinder.processElementAnnotations (AnnotationBinder. java: 1653) в org.hibernate.cfg.AnnotationBinder.fillComponent (AnnotationBinder. java: 2738) в org.hibernate.cfg.AnnotationBinder.fillComponent 2669 (10). в org.hibernate.cfg.AnnotationBinder.bindComponent (AnnotationBinder. java: 2568) в org.hibernate.cfg.AnnotationBinder.processElementAnnotations (AnnotationBinder. java: 2197) в org.hibernate.nof . java: 972) в org.hibernate.cfg.AnnotationBinder.bindClass (AnnotationBinder. java: 799) в org.hibernate.boot.model.source.internal.ann otations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies (AnnotationMetadataSourceProcessorImpl. java: 250) в org.hibernate.boot.model.process.spi.MetadataBuildingProcess. $ 1.processEntil. .spi.MetadataBuildingProcess.complete (MetadataBuildingProcess. java: 274) в org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata (EntityManagerFactoryBactoryBuilderImplint.Filg.Imp_MBT.Imp.FB.Imp_MB.Imp_MB.Imp. .build (EntityManagerFactoryBuilderImpl java:. 935) при org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory (SpringHibernateJpaPersistenceProvider java:. 57). в org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean java: 365) в org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFa (. AbstractEntityManagerFactoryBean java: 390) ctory на org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean java:. 377) в org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet (LocalContainerEntityManagerFactoryBean java.: 341) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory. java: 1821) в org.springframework. . 24 общих кадра опущено

Спасибо за любые подсказки!

...