У меня возникли проблемы при попытке восстановить соединение с Postgres сервером с помощью Spring Boot (в среде Eclipse). Объекты, относящиеся к конкретному случаю, выглядят следующим образом:
1 - Специализация - веб-приложение, в котором я работаю, обеспечивает онлайн-регистрацию на курсы атлетов колледжа, поэтому Specialization
означает гимнастику или спорт, на которые любой студент может подать заявку по своему усмотрению :
@Entity
@Table(name = "Specializations")
@Getter @Setter @NoArgsConstructor
public class Specialization {
@Id
@SequenceGenerator(name = "specialization_id_sequence", sequenceName = "specialization_id_sequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "specialization_id_sequence")
@Column(name = "id")
private Short id;
@Column(name="name")
private String name;
@ManyToOne
@JoinColumn(name="health_category_id", referencedColumnName = "id")
private HealthCategory category;
@Column(name="photo_file_path")
private String photoFilePath;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "specialization", cascade = CascadeType.ALL)
List <Trainer> trainerList;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "specialization", cascade = CascadeType.ALL)
List <Group> groupList;
//some hashCode() and equals() stuff here
@Override
public String toString() {
return "Specialization [id=" + id + ", name=" + name + ", min. approvable health category=" +
category.getId() + ", path=" + photoFilePath + "]";
}
2 - HealthCategory - обязательный класс здоровья, подлежащий официальному подтверждению для получения допуска к участию в задании по специализации (разные специализации могут быть представлены в одной и той же категории здоровья)
@Entity
@Table(name = "Health_categories")
@Getter @Setter @NoArgsConstructor
public class HealthCategory {
@Id
@SequenceGenerator(name = "category_id_sequence", sequenceName = "category_id_sequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "category_id_sequence")
@Column(name = "id")
private Short id;
@Column(name="name")
private String name;
@Column(name="state")
private Short state;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "category", cascade = CascadeType.ALL)
private List <Specialization> specialization;
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name="last_update")
private Date last_update;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "category", cascade = CascadeType.ALL)
private List <User> userList;
@Override
public String toString() {
return "Health category [id=" + id + ", name=" + name + ", state=" + state + ", last update on=" + last_update + "]";
}
3 - Группа - связанная со специализацией группа, в которую студент входит для прохождения курса
@Entity
@Table(name = "Groups")
@Getter @Setter @NoArgsConstructor
public class Group {
@Id
@SequenceGenerator(name = "groupIdSequence", sequenceName = "groupIdSequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "groupIdSequence")
@Column(name = "group_id")
private Long group_id;
// eventual values: "open", "close"
@Column(name="registration_status")
private String registrationStatus;
// admission quota
@Column(name="target_size")
private Integer targetSize;
// real group size evaluation at the moment
@Column(name="actual_size")
private Integer actualSize;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL)
private List <User> userList;
@ManyToOne
@JoinColumn(name="group_specialization_id", referencedColumnName = "id", nullable = false, unique = true)
private Specialization specialization;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name="schedules",
joinColumns = { @JoinColumn(name = "group_id") },
inverseJoinColumns = { @JoinColumn(name="schedule_id", nullable = false) })
private List<GroupSchedule> scheduleList;
@ManyToMany(mappedBy = "groupList")
private List<Trainer> trainerList;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name="locations",
joinColumns = { @JoinColumn(name = "group_id", nullable = false) },
inverseJoinColumns = { @JoinColumn(name="location_id", nullable = false) })
private List<Location> locationList;
@Column(name="description")
private String desciption;
4 - Тренер - инструктор, заинтересованный в проведении уроков для соответствующих групп студентов, которые проходят конкретный c курс:
@Entity
@Table(name = "Trainers")
@Getter @Setter @NoArgsConstructor
public class Trainer {
@Id
@SequenceGenerator(name = "trainerIdSequence", sequenceName = "trainerIdSequence", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "trainerIdSequence")
@Column(name = "trainer_id")
private Short trainer_id;
@Column(name="first_name")
private String firstName;
@Column(name="second_name")
private String secondName;
@Column(name="last_name)")
private String lastName;
@Column(name="photo_file_path")
private String photoFilePath;
@ManyToOne
@JoinColumn(name="specialization_id", referencedColumnName = "id", nullable = false, unique = true)
private Specialization specialization;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(
name="groups",
joinColumns = { @JoinColumn(name = "trainer_id", nullable = false) },
inverseJoinColumns = { @JoinColumn(name="group_id", nullable = false) })
private List<Group> groupList;
Из-за трудностей при запуске кода с Specialization
объектами, SpecializationService
будет размещено здесь:
@Service
public class SpecializationService {
@Autowired
private SpecializationRepository specializationRepository;
public SpecializationService(SpecializationRepository specializationRepository) {
this.specializationRepository = specializationRepository;
}
public void createSpecialization(Specialization specialization) {
specializationRepository.save(specialization);
}
public List<Specialization> findALL() {
return (List<Specialization>) specializationRepository.findAll();
}
public List<Specialization> getSpecializations() {
List<Specialization> specializations = new ArrayList<>();
specializationRepository.findAll().forEach(specializations::add);
return specializations;
}
}
SpecializationController
код:
@RestController
public class SpecializationController {
@Autowired
SpecializationService specializationService;
@RequestMapping("/specialization")
public List<Specialization> getSpecializations() {
return specializationService.getSpecializations();
}
@RequestMapping(method = RequestMethod.POST, value = "/specialization/create")
public void createSpecialization(@RequestBody Specialization spec) {
specializationService.createSpecialization(spec);
}
}
Кроме того, существует sql create table
материал:
CREATE SEQUENCE category_id_sequence;
CREATE TABLE Health_Categories (
id SMALLINT NOT NULL DEFAULT nextval('category_id_sequence') PRIMARY KEY,
name VARCHAR(30) DEFAULT NULL,
state SMALLINT NOT NULL,
last_update TIMESTAMP
);
-- Specialization --
CREATE SEQUENCE specialization_id_sequence;
CREATE TABLE Specializations (
id SMALLINT NOT NULL DEFAULT nextval('specialization_id_sequence') PRIMARY KEY,
name VARCHAR(50) DEFAULT NULL,
health_category_id SMALLINT REFERENCES health_categories (id),
photo_file_path VARCHAR(50) DEFAULT NULL,
CONSTRAINT specialization_ibfk_1 FOREIGN KEY (id) REFERENCES health_categories (id)
);
После выполнения @SpringBootApplication
класс выглядит следующим образом:
@SpringBootApplication
public class DatabaseComponentsApplication {
@Autowired
private HealthCategoryService categoryService;
@Autowired
private SpecializationService specializationService;
public static void main(String[] args) {
SpringApplication.run(DatabaseComponentsApplication.class, args);
}
@EventListener(ApplicationReadyEvent.class)
private void testJpaMethods() {
HealthCategory cat2 = new HealthCategory();
Date date = new Date();
Timestamp ts = new Timestamp(date.getTime());
cat2.setLast_update(ts);
cat2.setName("Test2");
cat2.setSpecialization(null);
cat2.setState((short) 8);
categoryService.createCategory(cat2);
Specialization spec = new Specialization();
spec.setCategory(cat2);
spec.setName("Soccer");
spec.setPhotoFilePath(null);
specializationService.createSpecialization(spec);
specializationService.getSpecializations().forEach(it -> System.out.println(it));
}
}
* 1 032 * он жалуется из-за неправильности, которую я все еще не могу понять:
Caused by: org.postgresql.util.PSQLException: error: syntax error at or near: ")" Position: 209
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2505) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2241) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:310) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:447) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:368) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:158) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:108) ~[postgresql-42.2.9%20(1).jar:42.2.9]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.1.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.4.9.Final.jar:5.4.9.Final]
... 74 common frames omitted
Не могли бы вы поделиться своими идеями, что вызывает синтаксис?
РЕДАКТИРОВАНИЕ: pom.xml
код следующий
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>databaseComponents</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>databaseComponents</name>
<description>DAO implementation draft </description>
<properties>
<java.version>1.8</java.version>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Также application.properties
материал:
spring.datasource.driver=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/core_database
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.main.web-application-type=none