SPRING - DataSource (SQL Error: 1054, SQLState: 42S22)

108
09 августа 2019, 14:20

Всем привет. Есть стандартный стек 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 он мне нужен т.к. там используется несколько БД...

Answer 1

Решение оказалось банальным!

Нужно просто брать и писать наименования столбца со знаком подчеркивания, вот так @Column(name = "created_at") и т.д. по такому же принципу, тк в базе этот столбец называется created_at.

А вот почему оно перестало понимать и парсить наименование столбца вида @Column(name = "createdAt") - это пока что загадка...

READ ALSO
Запись данных в файл и чтение с помощью thread

Запись данных в файл и чтение с помощью thread

Я пишу бота и у меня возник вопрос: нужно ли создавать отдельный поток для чтения/записи данных, чтобы не мешать другим процессам в боте?

143
Эффект рождественских огней

Эффект рождественских огней

Я пытаюсь создать рождественские огни (в январе), используя CSS -webkit-animation свойства

125
Как хранить в Store React компоненты?

Как хранить в Store React компоненты?

То есть у меня есть набор каких-то заранее созданных компонентов на react, и мне необходимо сделать для них общий store, где хранилось бы информация...

132
Изменение позиции блока с центра экрана на &ldquo;своё&rdquo; место в блоке

Изменение позиции блока с центра экрана на “своё” место в блоке

Описание задачи: Есть прелоадер, который показывает текст, пока страница грузитсяЕго текст совпадает с текстом в шапке сайта

116