web-dev-qa-db-ja.com

Spring Boot-Hibernate-テーブルが存在しません

すべてのエンティティとマッピングを保持するサードパーティのjarがあります。私は現在、このjarを従来のSpring-MVCアプリケーションで正常に使用していますが、Spring-Bootアプリケーションで使用しようとしています。 (1.5.7.RELEASE)

私はこれを自分のApplicaion.Javaに持っています:

@SpringBootApplication
@EntityScan(basePackages = "com.third.party.entity.package")
public class Application extends SpringBootServletInitializer {

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

これはサードパーティなので、セッションスキャンも行う必要があるので、これを@Configurationクラスに含めます。

@Bean
public LocalSessionFactoryBean sessionFactory(EntityManagerFactory emf) throws ClassNotFoundException {
    LocalSessionFactoryBean fact = new LocalSessionFactoryBean();
    fact.setAnnotatedPackages("com.third.party.entity.package");
    fact.setPackagesToScan("com.third.party.entity.package");
    fact.setDataSource(dataSource);
    return fact;
}

そしてこれは私のapplication.propertiesにあります:

spring.datasource.url=jdbc:mysql://dbserver:3306/mydb?useSSL=false
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.Tomcat.max-wait=20000
spring.datasource.Tomcat.max-active=50
spring.datasource.Tomcat.max-idle=20
spring.datasource.Tomcat.min-idle=15
spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

このエラーが発生しています:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mydb.user' doesn't exist

これで、テーブル名は「ユーザー」になりました。ただし、このjarを別のアプリケーションに使用しているため、このテーマに関する他の100件の回答はすべて適用されません。

構成の問題である必要がありますか?正しい?

[〜#〜] update [〜#〜]下記の@samの回答を試しても役に立たなかったが、このサードパーティのjarファイルのソースコードを確認できた。 :

@Entity
@Table(name = "User")
public class User {
     etc...
}

したがって、注釈のテーブル名は正しいです。 Springでそれを使用するにはどうすればよいですか?デフォルトの命名戦略などを探しています...何か提案はありますか?

13
mmaceachran

誰かを助けるかもしれない本当の答え(私にとって)は、暗黙の命名戦略をまったく使用しないことです。エンティティクラスで注釈が付けられたものだけを使用する場合は、次のような物理的なものを使用します。

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

@rsinhaの回答に感謝します。

テーブル名を変更するHibernateネーミング戦略

4
mmaceachran

Spring Boot-Hibernate-テーブルが存在しません

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mydb.user' **doesn't exist**

私のプログラムの問題@EntityScan(basePackages = "com.third.party.entity。package")はpackageJavaのパッケージ名に対応していません。

その他

Pojoエンティティーuserクラスが適切に定義されていることを確認してください

@Entity
@Table(name = "User")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    ...
    }

application.propertiesに以下の行コードを追加して実行してみてください

application.properties

# Hibernate ddl auto (create, create-drop, update, none): with "update" the database
# schema will be automatically updated accordingly to Java entities found in the project
spring.jpa.hibernate.ddl-auto = update

また、Hibernate自動構成クラスから除外します。下にアノテーションを追加して、そこにある場合

@SpringBootApplication(exclude={HibernateJpaAutoConfiguration.class})

これはスタックオーバーフローに対する同様のタイプの質問です Hibernateはテーブルが存在しないと言いますが、存在します

4
user4856296

私は同じ問題を抱えていましたが、解決策は異なります。どうやら、Hibernate/JPAはテーブル名のすべての文字を小文字にします。したがって、私のテーブルがUserで、

@Entity
@Table(name = "User")
public class OfficeUser {
...
}

私はまだエラーを言っているでしょう:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'doctors_office.user' doesn't exist

私の解決策は、DBのテーブル名をUserからuserに変更することでした(大文字->小文字)

注:テーブルに別のエンティティ名を使用していました(そのため、クラス名とテーブル名にOfficeUserを使用しています)

1
SnuKies

私は同様の問題に直面しましたが、その理由は、私のエンティティオブジェクトに、mysqlキーワードである「グループ」という名前のクラス変数があったためです。 @Columnを使用して注釈を付けていないため、「グループ」を列名として使用する必要がありました。解決策は、@ Columnでクラス変数に注釈を付けて別の名前を付けることでした。

 private String group;

  @Column(name="groupName")
    private String group;
1
Vaibs