2017-02-10 4 views
0

Я пытаюсь изучить базовую конфигурацию аннотаций Spring-Boot с hiberanate, чтобы сделать себе шаблон, который всегда будет работать. Я использую последнюю версию версии 1.51 с пружинной загрузкой на STS (набор инструментов для весны). 3.8.3.spring boot + hibernate - сущность не отображается + лучший способ конфигурации

вот мой главный:

@SpringBootApplication 
@EnableAutoConfiguration 
public class DemoApplication { 

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

теперь я знаю, что @SpringBootApplication автоматически приходит с @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. это лучший способ настроить спящий режим с пружинной загрузкой? для меня важно написать код по лучшим практикам.

, пожалуйста, дайте подробный ответ, чтобы я мог учиться на нем. любая другая информация, которая может быть полезна, приветствуется :) спасибо.

+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». Таким образом, вы должны изменить этот установщик на

Это должно сделать трюк.

+0

спасибо @M. Риццо, сейчас он работает :) –