Всем привет. Есть стандартный стек Java, SpringBoot-2.0.0, MySQL. И при попытке обращения к БД появилась проблема вида (неизвестный столбец в таблице) НО НЕ СПЕШИТЕ ПИСАТЬ ОТВЕТ:
2019-01-14 18:33:33.617 WARN 9388 --- [nio-5000-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1054, SQLState: 42S22
2019-01-14 18:33:33.617 ERROR 9388 --- [nio-5000-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column 'user0_.createdAt' in 'field list'
2019-01-14 18:33:33.626 ERROR 9388 --- [nio-5000-exec-5] c.e.p.s.JwtAuthenticationEntryPoint : Responding with unauthorized error. Message - could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Вообще то это "неизвестное поле" находится в классе родителе вызываемой сущности. Далее я выложу код...
Эта проблема возникла в результате того, что я начал конфигурировать DataSource и остальные настройки в класе. Прошу пояснить, и желательно на примере что я не правильно делаю...
В качестве примера выкладываю исходники:
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(
value = {"createdAt", "updatedAt"},
allowGetters = true
)
public abstract class DateAudit implements Serializable {
@CreatedDate
@Column(name = "createdAt")
private Instant createdAt;
@LastModifiedDate
@Column(name = "updatedAt")
private Instant updatedAt;
public Instant getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Instant createdAt) {
this.createdAt = createdAt;
}
public Instant getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Instant updatedAt) {
this.updatedAt = updatedAt;
}
}
а вот сущность которая наследует этот класс и как раз при ее вызове получается проблема
@Entity
@Table(name = "users", uniqueConstraints = {
@UniqueConstraint(columnNames = {
"username"
}),
@UniqueConstraint(columnNames = {
"email"
})
})
public class User extends DateAudit {
private static final long serialVersionUID = 1000000000000111L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotBlank
@Size(max = 40)
@Column(name = "name")
private String name;
@NotBlank
@Size(max = 15)
@Column(name = "username")
private String username;
@NaturalId
@NotBlank
@Size(max = 40)
@Email
@Column(name = "email")
private String email;
@NotBlank
@Size(max = 100)
@Column(name = "password")
private String password;
public User() {
}
public User(String name, String username, String email, String password) {
this.name = name;
this.username = username;
this.email = email;
this.password = password;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
а вот тот злополучный класс с конфигом
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = {"com.repo"} )
public class FooDbConfig {
@Autowired
private Environment env;
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
HashMap<String, Object> properties = new HashMap<>();
properties.put(" hibernate.ddl-auto", "update");
//env.getProperty(""));
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
//env.getProperty("org.hibernate.dialect.MySQL5InnoDBDialect"));
return builder.dataSource(dataSource)
.packages("com.model")
.persistenceUnit("test")
.properties(properties)
.build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Получается так - если я убираю вот этот класс с конф. то все работает прекрасно!
Заранее благодарен за ответ! PS/ Не обращайте внимае на @Primary он мне нужен т.к. там используется несколько БД...
Решение оказалось банальным!
Нужно просто брать и писать наименования столбца со знаком подчеркивания, вот так @Column(name = "created_at") и т.д. по такому же принципу, тк в базе этот столбец называется created_at.
А вот почему оно перестало понимать и парсить наименование столбца вида @Column(name = "createdAt") - это пока что загадка...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Я пишу бота и у меня возник вопрос: нужно ли создавать отдельный поток для чтения/записи данных, чтобы не мешать другим процессам в боте?
Я пытаюсь создать рождественские огни (в январе), используя CSS -webkit-animation свойства
То есть у меня есть набор каких-то заранее созданных компонентов на react, и мне необходимо сделать для них общий store, где хранилось бы информация...
Описание задачи: Есть прелоадер, который показывает текст, пока страница грузитсяЕго текст совпадает с текстом в шапке сайта