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