JPA, ошибка конфигурации таблицы Hibernate в Spring Project - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над проектом java, который использует Gradle, Spring, Spring Security, JPA и базу данных H2. Я пытаюсь использовать JPA персистентность для реализации таблиц базы данных для роли, пользователя и usecase-table.

Это мои application.properties

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.url=jdbc:h2:~/testdb;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

Вот мой @Entity User

@Entity
@Table(name = "user")
public class User {
    public User() {
    }
    public User(Long id, String email, String password, String fullname, boolean enabled){
        this.id = id;
        this.email=email;
        this.password=password;
        this.fullname=fullname;
        this.enabled=enabled;
    }

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

    private String email;

    private String password;

    private String fullname;

    private boolean enabled;

    @ManyToMany
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))

Вот моя роль @Entity

@Entity
@Table(name = "role")
public class Role {

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

    private String role;

    @ManyToMany(mappedBy = "roles")
    private Set<User> users;

Вот один из моих репозиториев для пользователя, остальные почти такие же:

public interface UserRepository extends JpaRepository<User, Long> {

    User findByEmail(final String email);

}

Вот MyCapecApp . java

@SpringBootApplication
public class MyCapecApp {

    private static final Logger log = LoggerFactory.getLogger(MyCapecApp.class);

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

    @Bean
    CommandLineRunner init(RoleRepository roleRepository) {

        return args -> {


            Role adminRole = roleRepository.findByRole("ADMIN");
            if (adminRole == null) {
                Role newAdminRole = new Role();
                newAdminRole.setRole("ADMIN");
                roleRepository.save(newAdminRole);
            }

            Role userRole = roleRepository.findByRole("USER");
            if (userRole == null) {
                Role newUserRole = new Role();
                newUserRole.setRole("USER");
                roleRepository.save(newUserRole);
            }
            log.info("Roles found with findll():");
            log.info("----------------------------------");
            for(Role rol : roleRepository.findAll()){
                log.info((roleRepository.toString()));
            }
            log.info("");
        };

    }

И вот ошибки, которые я получаю.

2020-04-21 16:34:21.668  WARN 16560 --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL "drop table role if exists" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table role if exists" via JDBC Statement
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "ROLE" because "FKT4V0RRWEYK393BDGT107VDX0X" depends on it; SQL statement:
drop table role if exists [90107-200]

И это следующая ошибка.

2020-04-21 16:34:21.678  WARN 16560 --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL "create table user (id bigint not null, email varchar(255), enabled boolean not null, fullname varchar(255), password varchar(255), primary key (id))" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table user (id bigint not null, email varchar(255), enabled boolean not null, fullname varchar(255), password varchar(255), primary key (id))" via JDBC Statement

    Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER" already exists; SQL statement:
    create table user (id bigint not null, email varchar(255), enabled boolean not null, fullname varchar(255), password varchar(255), primary key (id)) [42101-200]

Ошибки одинаково для всех трех таблиц. Я подключил свою базу данных 'testdb' в окне базы данных в intellij. Ранее я создал три таблицы в окне базы данных для одного пользователя, роли и таблицы вариантов использования с одним и тем же именем, но у меня все еще были ошибки, и у меня сложилось впечатление, что JPA сделал это для вас, когда вы запустили программу. Если это проблема, то, возможно, я просто ошибся в таблице? Если так, то может кто-нибудь сказать мне правильный способ сделать это? Когда я загружаю проект на localhost, все запускается, но пользовательский ввод не сохраняется в таблицах базы данных.

Это первый раз, когда я когда-либо делал какой-либо проект с использованием Spring или баз данных или такой сложности, поэтому я заранее прошу прощения за мое невежество. Я студент, и я действительно хочу научиться этому. Пожалуйста, дайте мне знать, если есть что-то еще, что я должен включить. Еще раз спасибо, и я очень ценю любую помощь, которую вы, ребята, можете предложить мне, и я очень благодарен за ваше терпение и ваше время.

...