2017-02-10 5 views
0

私はhiberanateでスプリングブートの基本アノテーション設定を学び、自分自身を常にうまくいくテンプレートにしようとしています。 私はSTS(スプリングツールスイート)でスプリングブート最新リリースバージョン1.51を使用しています。スプリングブート+ハイバネート - エンティティがマップされていない+コンフィギュレーションに最適な方法

がここに私のメインです:今

@SpringBootApplication 
@EnableAutoConfiguration 
public class DemoApplication { 

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

、私は@SpringBootApplicationがautomaticaly @componetScanが付属していることを知って、 はので、私はそれを追加しませんでした。

私のコンフィギュレーションクラス:

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef = "someEntityManagerFactory", transactionManagerRef = "someTransactionManager", basePackages = { 
     "com.example.*" }) 
@EntityScan(basePackages = "com.demo.models") 
@ConfigurationProperties(prefix = "mysql.datasource") 
public class DataBaseConfig { 

    @Autowired 
    private Environment env; 

    @Bean 
    public DataSource someDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(env.getProperty("mysql.datasource.driver-class-name")); 
     dataSource.setUrl(env.getProperty("mysql.datasource.url")); 
     dataSource.setUsername(env.getProperty("mysql.datasource.username")); 
     dataSource.setPassword(env.getProperty("mysql.datasource.password")); 
     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean someEntityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(someDataSource()); 
     em.setPackagesToScan(new String[] { "org.openlegacy.analytics.models" }); 
     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 

     return em; 
    } 

    @Bean 
    public PlatformTransactionManager someTransactionManager() { 
     JpaTransactionManager tm = new JpaTransactionManager(); 
     tm.setEntityManagerFactory(someEntityManagerFactory().getObject()); 
     tm.setDataSource(someDataSource()); 
     return tm; 
    } 

    Properties additionalProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto")); 
     properties.setProperty("hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect")); 
     properties.setProperty("spring.jpa.show-sql", env.getProperty("spring.jpa.show-sql")); 
     properties.setProperty("spring.jpa.hibernate.naming.physical-strategy", 
       env.getProperty("spring.jpa.hibernate.naming.physical-strategy")); 
     return properties; 
    } 

} 

私のコントローラクラス

私のリポジトリクラス

@Transactional 
@Repository 
public class UserRepository { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @SuppressWarnings("unchecked") 
    public List<User> getUsers() { 
     return entityManager.createQuery("select u from User u").getResultList(); 
    } 

    public String getMessage() { 
     return "hello"; 
    } 
} 

私のエンティティクラス

@Entity(name = "user") 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "user_name") 
    private String userName; 

    @Column(name = "password") 
    private String password; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

と私の性質は

# DataSource settings: set here your own configurations for the database connection. 
mysql.datasource.username=openlegacy 
mysql.datasource.password=openlegacy 
mysql.datasource.driver-class-name=com.mysql.jdbc.Driver 
mysql.datasource.url=jdbc:mysql://localhost:3306/olbank 
spring.jpa.database= MYSQL 

spring.data.jpa.repositories.enabled=true 
#spring.jpa.database-platform=org.hibernate.dialect.MYSQL5Dialect 

# Show or not log for each sql query 
spring.jpa.show-sql = true 

# Hibernate ddl auto (create, create-drop, update) 
spring.jpa.hibernate.ddl-auto = update 

# Naming strategy 
#spring.jpa.hibernate.naming.strategy= org.hibernate.cfg.ImprovedNamingStrategy 
spring.jpa.hibernate.naming.physical-strategy= org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

# The SQL dialect makes Hibernate generate better SQL for the chosen database 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 

とするとき、私はこのエラーを取得していますユーザテーブル からreteiveデータに抱き合わせてるファイル:

org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped... 

だから、 私の質問は:

  1. なぜこのエラーが発生していますか?私はそのユーザーが クラス名でマッピングされていることを知っています。それが私がやっていることです。
  2. これはspring-bootで休止状態を設定する最も良い方法ですか?ベストプラクティスでコードを書くことが重要です。

私はそれから学ぶことができるので詳細な回答をしてください。 有用な情報は歓迎です:) ありがとうございます。

+0

あなたの@EntityScanアノテーションは、basePackages = "com.demo.models"を示します。あなたのUserエンティティは実際にそのパッケージに入っていますか? –

+0

はい、それは "com.demo.models"パッケージ--Mです。 Rizzo –

+0

素晴らしい。あなたのDemoApplicationはどのパッケージですか? –

答えて

2

あなたは、あなたの全体的な構成に対処する必要があるいくつかのことがあります。現在、あなたのエンティティのユーザにエイリアスを提供している罰金ですが、あなたのエンティティに名前を提供しようとしているならば、それはあなたがそうJPQLでそれを参照する必要があるかである

@Entity(name = "user") 

は、「ユーザーからのuを選択し、U "にする必要があります

あなたの名前修飾子を取り除き、あなたのクエリを「ユーザーuから選択する」としておくとよいでしょう。

1)@EnableJpaRepositoriesアノテーションで、basePackagesを実際のリポジトリパッケージのベースを参照するように変更します。「com.demo.repository」と推測します。ワイルドカード参照を取り除く。 2)someEntityManagerFactory()メソッドでは、basePackageを(私が間違っていると思われる) "org.openlegacy.analytics.models"に設定しています。エンティティが "com.demo.models"の下にあることを示しました。だから、そのセッターを

em.setPackagesToScan(new String[] { "com.demo.models" }); 

に変更する必要があります。そのトリックを行う必要があります。

+0

ありがとうございます@M。 Rizzo、それは今働いている:) –

関連する問題