Почему мой Entity не работает с SpringBoot, хотя он работает без - PullRequest
0 голосов
/ 15 октября 2018

(Обратите внимание: при расследовании этой проблемы я лучше определил источник проблемы, который я здесь представляю)

Я очень новичок в Hibernate и SpringBoot,Мой проект имеет дело с поисковой системой, которая разделяет части индексации (клиент javafx) и поиска (веб-клиент).Веб-клиент использует SpringBoot, и в процессе запроса пользователя мне нужно найти информацию в индексе Solr для поиска.Эта информация хранится в локальной базе данных Hibernate / H2, где я использую следующий класс Entity:

@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

}

В классе LocalDatabase есть метод для перечисления всех IndexSetups из БД (есть и другие методы, но сосредоточенные наэтого достаточно, чтобы понять проблему).Мне нужно вызвать его в контроллере, но я получаю "Не сущность: класс IndexSetup" .

Однако единственный способ использовать мою сущность - это предотвратить запуск SpringBoot (т.е.комментирование строки, начинающейся с SpingApplication.run (...)):

@SpringBootApplication
public class ServerApplication {

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

ArrayList<IndexSetup> availableSearchIndex = 
LocalDatabase.getInstance(false) // no GUI
            .getAllIndexSetups();

// The list is displayed as long as SpringApplication.run() call is commented. Otherwise "Not an entity"
System.err.println("The Index setups are " + availableSearchIndex); 
  }
}

Конечно, это не решение, поскольку мне нужно обработать запрос пользователя с помощью Spring Boot: -D!

Наконец файл hibernate.cfg.xml читает:

<hibernate-configuration>
  <session-factory>      
    <!-- Database connection settings -->
    <property name="connection.driver_class">org.h2.Driver</property>
    <!--The db file resides wihtin the parent project (so one level above the calling project see ../)-->
    <!--We use the auto server mode to be able to open the database from server and from indexer simultaneously
    see http://www.h2database.com/html/features.html#auto_mixed_mode -->
    <property name="connection.url">jdbc:h2:file:../MyAppDB;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE</property>
    <property name="connection.username">test</property>
    <property name="connection.password"/>
    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.H2Dialect</property>
    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">false</property>
    <!-- Updates the existing database schema on startup -->
    <property name="hbm2ddl.auto">update</property>
    <!-- The mapping information of entities -->
    <mapping class="my.package.Entities.IndexSetup"/>
 </session-factory>
</hibernate-configuration>

Трассировка стека:

Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

Caused by: java.lang.IllegalArgumentException: Not an entity: class my.package.Entities.IndexSetup
at org.hibernate.metamodel.internal.MetamodelImpl.entity(MetamodelImpl.java:457)
at org.hibernate.query.criteria.internal.QueryStructure.from(QueryStructure.java:126)
at org.hibernate.query.criteria.internal.CriteriaQueryImpl.from(CriteriaQueryImpl.java:153)
at my.package.LocalDatabase.getAllIndexSetups(LocalDatabase.java:99)
at my.package.ServerApplication.main(ServerApplication.java:15)

И я только что заметил эти две строки, напечатанные Spring Boot назапуск:

2018-10-15 11:47:46.208  INFO 27730 --- [  restartedMain] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found // Maybe this one is not just "INFO"
2018-10-15 11:47:46.591  WARN 27730 --- [  restartedMain] org.hibernate.orm.connections.pooling    : HHH10001002: Using Hibernate built-in connection pool (not for production use!)
2018-10-15 11:47:46.594  INFO 27730 --- [  restartedMain] org.hibernate.orm.connections.pooling    : HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:file:../MyAppDB;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO] // Just to show that my bibernate.cfg.xml is found

Маловероятно, что это проблема зависимости, поскольку она перестает работать только при запуске приложения Spring.

Итак, мой вопрос: что я должен сделать, чтобы моя сущность работала в SpringBoot?

Любая помощь очень ценится!

1 Ответ

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

Добавление @EntityScan в ServerApplication.class.

@ EntityScan (org.springframework.boot.autoconfigure.domain.EntityScan) определяет, какие классы следует использовать в конкретном контексте персистентности.

...