Каков правильный обходной путь при обновлении сущностей в jhipster?

У меня есть модель класса UML. Я все время обновлял его, и после этого запускаю jhipster-uml .xmi для регенерации сущностей. У меня всегда заканчивались сообщения об ошибках. Я попытался удалить из файлов -jhipster файлы entity.json, но это не помогло. Не могли бы вы рассказать мне, как правильно обновлять объекты во время разработки? Я также попытался запустить задачу maven: diff, но безуспешно.

РЕДАКТИРОВАТЬ:

Я создал новое приложение jhipster и создал сущности из модели класса UML modelio. Все работает нормально. Затем я просто добавил один атрибут в свою модель и регенерировал объект из xmi-файла, и все снова сломалось.

Мой рабочий процесс был: 1) сохранить модель uml как xmi-файл 2) запустить jhipster-uml ac2.xmi -paginate 3) скомпилировать мое приложение в intellijIdea 4) запустить задачу maven: mvn compile Liquibase: diff для создания нового журнала изменений 5) запустить приложение 6) Следите за сообщениями об ошибках:

1 change sets check sum
      classpath:config/liquibase/changelog/20150828220237_added_entity_Employee.xml::20150828220237::jhipster is now: 7:dd10f74a01a95b4e48c592e796a1d352

Часть ошибки:

[DEBUG] com.acontrol.config.DatabaseConfiguration - Configuring Datasource
[DEBUG] com.acontrol.config.DatabaseConfiguration - Configuring Liquibase
[ERROR] org.springframework.boot.context.embedded.tomcat.TomcatStarter - Error starting Tomcat context: org.springframework.beans.factory.BeanCreationException
[WARN] org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474) ~[spring-context-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at com.acontrol.Application.main(Application.java:72) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_05]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_05]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_05]
    at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_05]
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) [idea_rt.jar:na]
Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:98) ~[spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:75) ~[spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:378) ~[spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:155) ~[spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:157) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE]
    ... 10 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(org.springframework.security.config.annotation.ObjectPostProcessor,java.util.List) throws java.lang.Exception; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService com.acontrol.config.SecurityConfiguration.userDetailsService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailsService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.acontrol.repository.UserRepository com.acontrol.security.UserDetailsService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot create inner bean '(inner bean)#5550ca83' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#5550ca83': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[s

person Sami    schedule 28.08.2015    source источник
comment
Я больше не уверен на 100%, потому что я удалил весь проект и снова сгенерировал все приложение, но каждый раз, когда я пытаюсь обновить свою uml-модель, я получал сообщения об ошибках. Я хотел бы знать, как правильно обновлять сущности. Я всегда перезаписываю старые объекты и удаляю папку .jhipster перед обновлением. Что может быть правильным или возможно ли это с помощью jhipster-uml?   -  person Sami    schedule 29.08.2015


Ответы (3)


Когда я хочу восстановить все свои таблицы, я делаю это

  1. Обновите модель в MODELIO
  2. Реэкспорт xmi
  3. rm -rf ./.jhipster/
  4. Open file src/main/resources/config/liquibase/master.xml and remove all <include> elements except
    • config/liquibase/changelog/00000000000000_initial_schema.xml, and
    • Комментарий «JHipster добавит сюда журналы изменений Liquibase»
  5. Иногда мне приходится удалять строки (кроме первой, имеющей ID ='00000000000001') из таблицы DATABASECHANGELOG
  6. Перезапустить jhipster-uml
person Angelo Quaglia    schedule 29.08.2015
comment
БЛАГОДАРНОСТЬ! Я попробую это. Я позже расскажу, как это было, но если в вашем случае это работает, думаю, что и в моем случае! - person Sami; 29.08.2015
comment
Удачи! Я также нашел некоторую документацию на странице jhipster.github.io/development.html - person Angelo Quaglia; 29.08.2015
comment
Это работает, приятно :) Вы заметили какие-либо ошибки или странные вещи при создании сущностей из модели Modelio? У меня есть один случай (отношение oneToOne), который не работает, другие похожие. ИМХО, эта документация не дает рабочего решения. Кстати, мне пришлось удалить свои таблицы из БД ... - person Sami; 01.09.2015
comment
С тех пор я отказался от Modelio и перешел на JDL. Все заработало как положено. - person Angelo Quaglia; 20.11.2016

Проблема в том, что jhipster-uml не поддерживает развитие схемы. Другими словами, как только jhipster-uml сгенерирует ресурсы вашего приложения и журналы изменений Liquibase, он забывает, что делал, и при следующем запуске генерирует все с нуля - это нормально для большинства артефактов, но НЕ для журналов изменений.

Есть два способа решить эту проблему:

  • Удалите журналы изменений перед повторным запуском jhipster

    • detailed in another answer, in addition drop all existing DB tables before re-running your application.
  • Используйте jhipster-uml с liquibase diff

    1. Modify your UML model
    2. Экспорт xmi
    3. Беги jhipster-uml
    4. Отменить все изменения журналов изменений, включая master.xml (с помощью VCS или истории файлов)
    5. Скомпилируйте свой код Java: compileJava
    6. Запустите Liquibase diff liquibaseDiffChangelog: это сравнивает ваши объекты с текущим состоянием базы данных и генерирует фактический журнал изменений, то есть содержащий изменения, и добавляет запись в master.xml.
    7. Запустите приложение с bootRun: задача Liquibase выполнит все незавершенные журналы изменений.

Примечание: будьте осторожны при удалении и переименовании объектов: вам придется пойти и удалить несколько потерянных файлов из интерфейсных ресурсов, классов java, журналов изменений, таблиц базы данных, объектов .jhipster.

person martind    schedule 22.02.2016
comment
Просто помните, что он ничего не удалит. Итак, если вы удалите объект из схемы, вам придется вручную удалить классы из проекта. - person Michael D Johnson; 01.09.2016

На всякий случай кто-нибудь столкнется с этой ситуацией и использует Gradle. Вот что я сделал:

1-й. Проверьте файл master.xml и включенные в него файлы, чтобы убедиться, что все в порядке.

Тогда clearChecksums.

согласно документации по жидкой базе

it Removes current checksums from database. On next run checksums will be recomputed.

So

Откройте файл liquidbase.gradle и добавьте следующую запись:

task liquibaseClearChecksums(dependsOn: compileJava, type: JavaExec) {
    group = "liquibase"

    classpath sourceSets.main.runtimeClasspath
    classpath configurations.liquibase
    main = "liquibase.integration.commandline.Main"

    args "--changeLogFile=src/main/resources/config/liquibase/changelog/" + buildTimestamp() +"_changelog.xml"
    args "--referenceUrl=hibernate:spring:com.asimplemodule.deptmanager.domain?dialect=com.asimplemodule.deptmanager.domain.util.FixedPostgreSQL82Dialect&hibernate.ejb.naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy"
    args "--username=mycoolapp"
    args "--password=mycoolapp"
    args "--url=jdbc:postgresql://localhost:5432/mycoolApp"
    args "--driver=org.postgresql.Driver"
    args "clearChecksums"

}

Затем просто запустите gradle liquibaseClearChecksums

И это устранило мою проблему.

Надеюсь, это кому-то поможет

person jstuartmilne    schedule 16.11.2016