SpringBoot "не сущность" - PullRequest
       13

SpringBoot "не сущность"

0 голосов
/ 14 октября 2018

Я новичок в Hibernate и SpringBoot.Мои проекты имеют дело с поисковой системой, которая состоит из 2 независимых модулей + 1 базовый модуль, общий для обоих (где находится класс IndexSetup).

Существует один модуль для индексации (JavaFx) и другойдля поиска через веб-браузер (Spring Boot).

Модуль индексирования включает в себя класс "IndexSetup", который содержит подробную информацию о том, как / что следует индексировать:

@Entity
@Table(name = "IndexSetups")
@Access(AccessType.PROPERTY)
public class IndexSetup {
  private final SimpleIntegerProperty id = new SimpleIntegerProperty();

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO) // For H2 AUTO is required to auto increment the id
  public int getId() {
      return id.get();
  }

  //... other properties, getters and setters

 }

Так что это работаетОтлично, данные индексируются и могут быть получены с помощью метода поиска в модуле индексации.

Однако, когда я запускаю сервер Spring Boot и выполняю тот же поиск, я получаю исключение java.lang.IllegalArgumentException: Не сущность:class my.package.IndexSetup

Кстати, нет ошибки сборки, и до того, как модули были частью родительского проекта pom, они находились в одном проекте с классом сервера в подпапке, и это работало,Я решил разделить их для удобства во время разработки и предложить два независимых модуля в производстве.

Так почему же это работало, когда все было в рамках одного проекта Netbeans и теперь, когда модули находятся в 2 разных подпапках (но втот же пакет группового идентификатора "my.package") Я получаю это "Не сущность", и что я должен сделать, чтобы решить это, где я должен посмотреть?

Обратите внимание: я уже пробовал это без успеха («исключение нулевого указателя, невозможно загрузить базу данных»).

Редактировать 1: Я также пытался добавить @EntityScan после этого , ноЯ все еще получаю Not an entity: class my.package.IndexSetup:

@SpringBootApplication
@EntityScan( basePackages = {"my.package"} )
public class ServerApplication {

public static void main(String[] args) {
    SpringApplication.run(ServerApplication.class, args);
 }
}

Редактировать 2: Архитектура проекта выглядит так:

- Parent project (my.package)
  -Module Base (with IndexSetup class)
  -Module Indexing (that depends on Base)
  -Module Server (that also depends on Base)

Родительский pom.xml читается какследующее:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.package</groupId>
<artifactId>MyApp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--According to https://stackoverflow.com/questions/10665936/maven-how-to-build-multiple-independent-maven-projects-from-one-project-->

<modules>
    <module>Base</module> <!-- Common resources which is a dependency in Indexer and Server -->
    <module>Indexer</module> <!-- Indexing part with JavaFx-->
    <module>Server</module> <!-- Server (spring boot) part of -->
</modules>
<name>MyApp</name>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <compilerArguments>
                    <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.16</version>
            <configuration>
                <additionalClasspathElements>
                    <additionalClasspathElement>${java.home}/lib/jfxrt.jar</additionalClasspathElement>
                </additionalClasspathElements>
            </configuration>
        </plugin>
    </plugins>
</build>

Редактировать 3: Проблема возникает, когда указана таблица для просмотра:

Root<IndexSetup> from = criteriaQuery.from(IndexSetup.class);

Просмотр спящие источники not an entity выбрасывается всякий раз, когда entityType == null. Так что я не понимаю, почему тип сущности здесь нулевой, тогда как он работает вне SpringBoot?

Редактировать 4: Если я удаляю SpringApplication.run(ServerApplication.class, args); с сервераЗатем основной метод класса тот же вызов, который вызывал проблему, то есть:

LocalDatabase.getInstance(false) // no GUI
            .getAllIndexSetups();

теперь работает picobello.Конечно, это ничего не решает, так как мне все еще нужен SpringBoot для поиска!Так что для меня это означает, что Spring Boot не понимает конфигурацию гибернации.Я открыл новый вопрос , чтобы представить проблему более точно.

Любая помощь приветствуется,

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Вначале некоторые проверки:

  • Вся ваша конфигурация построена только с аннотациями в ServerApplication или каком-либо классе Java, или есть какие-либо другие внешние конфигурации в файлах XML / YML?Может быть, искать конфликты.Мы предпочитаем не смешивать XML с конфигурацией аннотаций, если это возможно.
  • Попробуйте удалить @Serializable (не обязательно).
  • Попробуйте переместить вашу сущность в корневой пакет (просто в качестве теста).
  • Проверьте правильность пакета, который экспортирует @Entity.

Вопрос: что вы называете "модулем", это подпакет или модуль Maven или что-то еще?Может быть, у нас есть конфигурация имен пакетов по этому поводу?

Редактировать :

  • В случае многомодульного проекта вы следовали рекомендациям spring.io о многомодульных проектах?Вы импортировали Spring BOM (или стартер) в свои подмодули и тестировали ли вы Spring Boot Maven Plugin ?
  • Можете ли вы предоставить application.properties (или application.yml как угодно)ваша конфигурация источника данных?Вы должны проверить, правильно ли определен ваш источник данных (и JPA, класс драйвера, ...);см spring.io
0 голосов
/ 16 октября 2018

Так получилось, что я не правильно использовал возможности SpringBoot.Вот шаги, за которыми я следовал.Пожалуйста, помните архитектуру проекта:

- Parent maven project (my.package)
 |-Module Base (with IndexSetup class and [initialy] hibernate.cfg.xml in /resources. It also had in the beginning LocalDatabase class to access to the local db via hibernate)
 |-Module Indexing (that depends on Base)
 |-Module Server (that also depends on Base)
 |-Database file (myLocalDB)

1) Сначала я удалил hibernate.cfg.xml из базы и поместил его в ресурсы модуля индексирования.Я сделал это, потому что SpringBoot имеет свой собственный механизм конфигурации.Я также удалил класс LocalDatabase из Base (поскольку он не понадобится SpringBoot) и также удалил его в модуле индексирования (где он действительно используется).

2) После [this] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html] Я добавил spring-boot-starter-data-jpa в серверный модуль pom.xml.

3) Следуя этому руководству Я создал репозиторий JPA IndexSetupRepository с одной строкой кода:

public interface IndexSetupRepository extends CrudRepository<IndexSetup, Integer> {

}

4) На сервере application.properties я добавил следующие строки:

# Embedded database configuration
# The embedded database file is one level above the Server folder (ie directly within the parent project)
# we use the auto server mode to be able to use the database simultaneously in the indexer and the server
spring.datasource.url=jdbc:h2:file:../myLocalDB;AUTO_SERVER=TRUE
spring.datasource.username=myName
# This parameter helped me discover that SpringBoot was not targetting the right table name.
spring.jpa.hibernate.ddl-auto=validate

5) Как говорил SpringBoot, он не смог найти таблицу с именем index_setup (см. дело верблюда, преобразованное в _ ), мне пришлось добавить эту строку в application.properties:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

6) Теперь, когда я получил "Entity not managed",В конце концов я добавил аннотацию @EntityScan в основной класс Сервера, как многие из вас посоветовали мне сделать.

@EntityScan("my.package.Entities")

Обратите внимание, что @EntityScan должен указывать на папку, содержащую класс сущности, а не наСам класс сущности т.е. @EntityScan("my.package.Entities.IndexSetup") не работал.

0 голосов
/ 14 октября 2018

Я думаю, что вы должны добавить в свой пакет аннотаций @EntityScan ваших сущностей во втором проекте / модуле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...