2017-02-10 75 views
0

我試圖學習spring-boot基本註釋配置與hiberanate,使自己的模板,將始終工作。 我使用STS(彈簧工具套件)3.8.3上的spring-boot最新版本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配置hibernate的最佳方法嗎?通過最佳實踐編寫代碼對我來說非常重要。

請給出詳細的答案,以便我可以從中學習。 任何其他可用的信息,歡迎:) 謝謝。

+0

您的@EntityScan註釋表示basePackages =「com.demo.models」。您的用戶實體是否在該包中? –

+0

是的,它在「com.demo.models」包中 - @M。 Rizzo –

+0

太好了。你的DemoApplication包含什麼包? –

回答

2

好的。您需要在整體配置中解決一些問題。您目前提供的是別名,你的實體用戶

@Entity(name = "user") 

這是好的,但如果你要提供一個名稱,以你的實體,然後這就是你需要如何在JPQL引用它的話,「從用戶選擇U U 「將需要成爲

select u from user 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,現在正在工作:) –