Я новичок в Java EE и пытаюсь реализовать отношения Hibernate JPA, но что происходит, одна из таблиц, которые являются платежами, не создается и выдает ошибку ниже, однако таблица соединения существует:
GenerationTarget encountered exception accepting command : Error executing DDL "create table payments (reference varchar(255) not null, Status Pending, ThirdPartyReference varchar(255) not null, amount double precision not null, dateCompleted date, dateCreated date not null, description varchar(255), dueDate date, payer_PhoneNumber varchar(12) not null, specialReference varchar(14) not null, acctount_id bigint, primary key (reference)) engine=InnoDB" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL
Ниже приводится информация о классе оплаты:
package Organization.Core.Gateway.entities;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
@Entity (name= "payments")
public class Payment {
public Account getServiceProvider() {
return ServiceProvider;
}
public void setServiceProvider(Account serviceProvider) {
ServiceProvider = serviceProvider;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public String getThirdPartyReference() {
return ThirdPartyReference;
}
public void setThirdPartyReference(String thirdPartyReference) {
ThirdPartyReference = thirdPartyReference;
}
public String getReference() {
return reference;
}
public void setReference(String reference) {
this.reference = reference;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getSpecialReference() {
return specialReference;
}
public void setSpecialReference(String specialReference) {
this.specialReference = specialReference;
}
public String getStatus() {
return Status;
}
public void setStatus(String status) {
Status = status;
}
public String getPayer_PhoneNumber() {
return payer_PhoneNumber;
}
public void setPayer_PhoneNumber(String MSISDN) {
this.payer_PhoneNumber = MSISDN;
}
public LocalDate getDateCreated() {
return dateCreated;
}
public void setDateCreated(LocalDate dateCreated) {
this.dateCreated = dateCreated;
}
public LocalDate getDateCompleted() {
return dateCompleted;
}
public void setDateCompleted(LocalDate dateCompleted) {
this.dateCompleted = dateCompleted;
}
public LocalDate getDueDate() {
return dueDate;
}
public void setDueDate(LocalDate dueDate) {
this.dueDate = dueDate;
}
@OneToOne(targetEntity = Account.class, cascade = CascadeType.ALL)
@JoinColumn(name = "acctount_id", referencedColumnName = "Id")
private Account ServiceProvider;
private double amount;
@Column(unique = true, nullable = false)
private String ThirdPartyReference;
@Id
//@GeneratedValue(strategy = GenerationType.AUTO)
//@SequenceGenerator(name = "reference_generator", sequenceName = "PAY", allocationSize = 15)
private String reference;
private String description;
@Column(nullable = false, length = 14)
private String specialReference;
@Column(columnDefinition = "Pending")
private String Status;
@Column(nullable = false,length =12)
private String payer_PhoneNumber;
@Column(nullable = false)
private LocalDate dateCreated;
private LocalDate dateCompleted;
private LocalDate dueDate;
}
, чем информация об учетной записи:
package Organization.Core.Gateway.entities;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Set;
@Entity( name = "accounts")
@Inheritance(strategy = InheritanceType.JOINED)
public class Account {
@Override
public String toString() {
return "Account{" +
"Id=" + Id +
", FirstName='" + FirstName + '\'' +
", Surname='" + Surname + '\'' +
", Payments=" + Payments +
'}';
}
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String firstName) {
FirstName = firstName;
}
public String getSurname() {
return Surname;
}
public void setSurname(String surname) {
Surname = surname;
}
public Set<Payment> getPayments() {
return Payments;
}
public void setPayments(Set<Payment> payments) {
Payments = payments;
}
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
@NotNull
private String FirstName;
@NotNull
private String Surname;
@OneToMany(targetEntity = Payment.class, fetch = FetchType.LAZY)
private Set<Payment> Payments;
}
И, наконец, учетная запись продавца, к которой я хочу получить доступ:
package Organization.Core.Gateway.entities;
import javax.persistence.Column;
import javax.persistence.Entity;
@Entity(name = "merchants")
public class Merchant extends Account{
public int getMpesa_ServiceproviderCode() {
return mpesa_ServiceproviderCode;
}
public void setMpesa_ServiceproviderCode(int mpesa_ServiceproviderCode) {
this.mpesa_ServiceproviderCode = mpesa_ServiceproviderCode;
}
public String getOrganizationName() {
return organizationName;
}
public void setOrganizationName(String organizationName) {
this.organizationName = organizationName;
}
@Column(name = "providershortCode")
private int mpesa_ServiceproviderCode;
@Override
public String toString() {
return "Merchant{" +
"mpesa_ServiceproviderCode=" + mpesa_ServiceproviderCode +
", organizationName='" + organizationName + '\'' +
'}';
}
private String organizationName;
}
Сведения о файле персистентности
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="molapayPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/organization" />
<property name="javax.persistence.jdbc.user" value="organization" />
<property name="javax.persistence.jdbc.password" value="_P4ym3nt01" />
<!--Hibernate Configuration -->
<!-- dialect for MySQL-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.flushMode" value="FLUSH_AUTO" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<!-- POOL -->
<property name="hibernate.c3p0.min_size" value="5"/>
<property name="hibernate.c3p0.max_size" value="20"/>
<property name="hibernate.c3p0.timeout" value="300"/>
<property name="hibernate.c3p0.max_statements" value="50"/>
<property name="hibernate.c3p0.idle_test_period" value="3000"/>
</properties>
</persistence-unit>
</persistence>
PS: Я прочитал несколько статей, которые пытался изменить диалект, потому что я использую mariadb, и рецензировал статьи, даже здесь .