Контролирует порядок создания таблиц в jpa

#mysql #jpa

#mysql #jpa

Вопрос:

Существует ли способ контролировать порядок, в котором таблицы были созданы поставщиком сохраняемости? Я получил эту ошибку mysql 1146. Я полагаю, это происходит потому, что он пытается создать объект, который необходим для таблицы резервирования, но он не нашел его, поэтому это вызывает следующее исключение. Существует ли способ это исправить?

 Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'volaconnoi_db.reservation' doesn't exist
Error Code: 1146
Call: ALTER TABLE RESERVATION ADD CONSTRAINT FK_RESERVATION_ROUTE_ID_ROUTE FOREIGN KEY (ROUTE_ID_ROUTE) REFERENCES ROUTE (ID_ROUTE)
Query: DataModifyQuery(sql="ALTER TABLE RESERVATION ADD CONSTRAINT FK_RESERVATION_ROUTE_ID_ROUTE FOREIGN KEY (ROUTE_ID_ROUTE) REFERENCES ROUTE (ID_ROUTE)")
  

Это объект USER_CREDENTIAL

 @Entity
@Table(name = "USER_CREDENTIAL")
@SecondaryTable(name = "CLIENT", pkJoinColumns=@PrimaryKeyJoinColumn(name="USERNAME"))
public class UserCredential implements Serializable
{
    private String username;
    private String password;
    private String email;
    private String group_name;

    private Date create_date;

    private String name;
    private String surname;
    private String address;
    private String city;
    private String zip_code;
    private String country;
    private int fidelity_points;

    private List<PhoneNumber> phoneNumbers;

    private List<Reservation> reservationsList;

    public UserCredential()
    {

    }

    @Id
    @Column(name = "USERNAME", nullable = false)
    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    @Column(name = "PASSWORD", nullable = false)
    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    @Column(name = "EMAIL", nullable = false)
    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    @Column(name = "GROUP_NAME", insertable = false, updatable = false)
    public String getGroup_name()
    {
        return group_name;
    }

    public void setGroup_name(String group_name)
    {
        this.group_name = group_name;
    }

    @Column(name = "CREATE_DATE", insertable = false, updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    public Date getCreate_date()
    {
        return create_date;
    }

    public void setCreate_date(Date create_date)
    {
        this.create_date = create_date;
    }



    @Column(name = "NAME", nullable= false, table="CLIENT")
    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    @Column(name = "SURNAME", nullable= false, table = "CLIENT")
    public String getSurname()
    {
        return surname;
    }

    public void setSurname(String surname)
    {
        this.surname = surname;
    }

    @Column(name = "ADDRESS", nullable= false , table = "CLIENT")
    public String getAddress()
    {
        return address;
    }

    public void setAddress(String address)
    {
        this.address = address;
    }

    @Column(name = "CITY", nullable = false, table = "CLIENT")
    public String getCity()
    {
        return city;
    }

    public void setCity(String city)
    {
        this.city = city;
    }

    @Column(name = "ZIP_CODE", nullable = false, table = "CLIENT")
    public String getZip_code()
    {
        return zip_code;
    }

    public void setZip_code(String zip_code)
    {
        this.zip_code = zip_code;
    }

    @Column(name = "COUNTRY", nullable = false, table = "CLIENT")
    public String getCountry()
    {
        return country;
    }

    public void setCountry(String country)
    {
        this.country = country;
    }

    @Column(name = "FIDELITY_POINTS", nullable = false, table = "CLIENT")
    public int getFidelity_points()
    {
        return fidelity_points;
    }

    public void setFidelity_points(int fidelity_points)
    {
        this.fidelity_points = fidelity_points;
    }

    @ElementCollection
    @CollectionTable(name = "CLIENT_PHONE_NUMBER", joinColumns = @JoinColumn(name = "USERNAME"))
    public List<PhoneNumber> getPhoneNumbers()
    {
        return phoneNumbers;
    }

    public void setPhoneNumbers (List<PhoneNumber> phoneNumbers)
    {
        this.phoneNumbers = phoneNumbers;
    }

    @OneToMany(mappedBy = "username", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    public List<Reservation> getReservationsList()
    {
        return reservationsList;
    }

    public void setReservationsList(List<Reservation> reservationsList)
    {
        this.reservationsList = reservationsList;
    }


    @Override
    public int hashCode()
    {
        int hash = 0;
        hash  = (username != null ? username.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object)
    {
        // TODO: Warning - this method won't work in the case the username fields are not set
        if (!(object instanceof UserCredential))
        {
            return false;
        }
        UserCredential other = (UserCredential) object;
        if ((this.username == null amp;amp; other.username != null) || (this.username != null amp;amp; !this.username.equals(other.username)))
        {
            return false;
        }
        return true;
    }

    @Override
    public String toString()
    {
        return "it.volaconoi.entity.UserCredential[ id="   username   " ]";
    }

}
  

ЭТО ОБЪЕКТ МАРШРУТА

 @Entity
@Table(name = "ROUTE")

public class Route implements Serializable
{
    private String id_route;  
    private String airlane;  
    private String aircraft_id;
    private Airport airport_city_source;   
    private Airport airport_city_dest; 
    private Date departure_date;  
    private Date arrival_date;   
    private String travel_class;
    private int seats;
    private float price;

    private List<Reservation> reservationsList;

    public Route()
    {    
    }

    @PrePersist
    public void setIdRoute()
    {
        SimpleDateFormat sdf = new SimpleDateFormat("ddMMYYYYHHmm");

        String format_departure_date = sdf.format(this.getDeparture_date());

        String unique_id_route = this.getAirlane()  
                                 this.getAircraft_id()   
                                 this.getAirport_city_source().getCity()  
                                 this.getAirport_city_dest().getCity()  
                                 format_departure_date;

        this.setId_route(unique_id_route.replaceAll(" ", ""));
    }

    @Id
    @Column(name = "ID_ROUTE")
    public String getId_route()
    {
        return id_route;
    }

    public void setId_route(String id_route)
    {
        this.id_route = id_route;
    }

    @Column(name = "AIRLANE", nullable = false)
    public String getAirlane()
    {
        return airlane;
    }

    public void setAirlane(String airlane)
    {
        this.airlane = airlane;
    }

    @Column(name = "AIRCRAFT_ID", nullable = false)
    public String getAircraft_id()
    {
        return aircraft_id;
    }

    public void setAircraft_id(String aircraft_id)
    {
        this.aircraft_id = aircraft_id;
    }

    @OneToOne(optional = false)
    public Airport getAirport_city_source()
    {
        return airport_city_source;
    }

    public void setAirport_city_source(Airport airport_city_source)
    {
        this.airport_city_source = airport_city_source;
    }

    @OneToOne(optional = false)
    public Airport getAirport_city_dest()
    {
        return airport_city_dest;
    }

    public void setAirport_city_dest(Airport airport_city_dest)
    {
        this.airport_city_dest = airport_city_dest;
    }

    @Column(name = "DEPARTURE_DATE", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    public Date getDeparture_date()
    {

        return this.departure_date;
    }

    public void setDeparture_date(Date departure_date)
    {
        this.departure_date = departure_date;
    }

    @Column(name = "ARRIVAL_DATE", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    public Date getArrival_date()
    {
        return arrival_date;
    }

    public void setArrival_date(Date arrival_date)
    {
        this.arrival_date = arrival_date;
    }

    @Column(name = "TRAVEL_CLASS", nullable = false)
    public String getTravel_class()
    {
        return travel_class;
    }

    public void setTravel_class(String travel_class)
    {
        this.travel_class = travel_class;
    }

    @Column(name = "SEATS", nullable = false)
    public int getSeats()
    {
        return seats;
    }

    public void setSeats(int seats)
    {
        this.seats = seats;
    }

    @Column(name = "PRICE", nullable = false)
    public float getPrice()
    {
        return price;
    }

    public void setPrice(float price)
    {
        this.price = price;
    }

    @OneToMany(mappedBy = "route", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    public List<Reservation> getReservationsList()
    {
        return reservationsList;
    }

    public void setReservationsList(List<Reservation> reservationsList)
    {
        this.reservationsList = reservationsList;
    }

    @Override
    public int hashCode()
    {
        int hash = 0;
        hash  = (id_route != null ? id_route.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object)
    {
        // TODO: Warning - this method won't work in the case the id_route fields are not set
        if (!(object instanceof Route))
        {
            return false;
        }
        Route other = (Route) object;
        if ((this.id_route == null amp;amp; other.id_route != null) || (this.id_route != null amp;amp; !this.id_route.equals(other.id_route)))
        {
            return false;
        }
        return true;
    }

    @Override
    public String toString()
    {
        return "it.volaconoi.entity.Route[ id="   id_route   " ]";
    }    
}
  

Это объект РЕЗЕРВИРОВАНИЯ

 @Entity
@Table(name = "RESERVATION")
public class Reservation implements Serializable
{
    private String id;
    private int passengers;
    private int luggages;
    private float price;
    private Date date_reservation;
    private boolean cancelled;

    private UserCredential username;

    private Route route;

    public Reservation()
    {  

    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID_RESERVATION")
    public String getId()
    {
        return id;
    }

    public void setId(String id)
    {
        this.id = id;
    }

    @Column(name = "PASSENGERS", nullable = false)
    public int getPassengers()
    {
        return passengers;
    }

    public void setPassengers(int passengers)
    {
        this.passengers = passengers;
    }

    @Column(name = "LUGGAGES", nullable = false)
    public int getLuggages()
    {
        return luggages;
    }

    public void setLuggages(int luggages)
    {
        this.luggages = luggages;
    }

    @Column(name = "PRICE", nullable = false)
    public float getPrice()
    {
        return price;
    }

    public void setPrice(float price)
    {
        this.price = price;
    }

    @Column(name = "DATE_PLACED", insertable = false, updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    public Date getDate_reservation()
    {
        return date_reservation;
    }

    public void setDate_reservation(Date date_reservation)
    {
        this.date_reservation = date_reservation;
    }

    @Column(name = "CANCELLED", nullable = false)
    public boolean isCancelled()
    {
        return cancelled;
    }

    public void setCancelled(boolean cancelled)
    {
        this.cancelled = cancelled;
    }

    @ManyToOne
    @JoinColumn(name = "USERNAME", nullable = false)
    public UserCredential getUsername()
    {
        return username;
    }

    public void setUsername(UserCredential username)
    {
        this.username = username;
    }

    @ManyToOne
    @JoinColumn(name = "ID_ROUTE", nullable = false)
    public Route getRoute()
    {
        return route;
    }

    public void setRoute(Route route)
    {
        this.route = route;
    }

    @Override
    public int hashCode()
    {
        int hash = 0;
        hash  = (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object)
    {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Reservation))
        {
            return false;
        }
        Reservation other = (Reservation) object;
        if ((this.id == null amp;amp; other.id != null) || (this.id != null amp;amp; !this.id.equals(other.id)))
        {
            return false;
        }
        return true;
    }

    @Override
    public String toString()
    {
        return "it.volaconoi.entity.Reservation[ id="   id   " ]";
    }
}
  

Как вы можете видеть, эти три объекта связаны друг с другом

Комментарии:

1. Никто не знает, как решить проблему? Любая идея… Я застрял здесь с двух дней…

2. Я не думаю, что кто-нибудь может рассказать вам о проблеме без дополнительной информации, и я не думаю, что это связано с упорядочением — включите ведение журнала в Finest и посмотрите, что выдается. Вероятно, попытка создать таблицу РЕЗЕРВИРОВАНИЯ завершилась неудачей до того, как ваш поставщик JPA выпустил для нее инструкцию alter table, поэтому вам нужно выяснить, почему. Попробуйте назвать свой вопрос так, чтобы он соответствовал реальной проблеме, которую вы пытаетесь решить, чтобы привлечь к ней больше внимания, поскольку упорядочение таблиц в JPA может не сильно повлиять на ответы — и я не уверен, что это действительно поможет в любом случае.

3. Я знаю причину, по которой это не так work…it это действительно просто … jpa отстой, и это правда

4. проблема в том, что я не знаю, какой еще информацией я делюсь…

5. Понятия не имею, почему какой-то идиот проголосовал против этого, поэтому проголосовал за компенсацию. ДЛЯ ВСЕХ: если вы проголосуете против чего-то без объяснения причин, вы идиот. Никаких сомнений, первоклассный дебил.

Ответ №1:

Я считаю, что это ошибка, поэтому исправление этого может устранить вашу проблему. Опять же, это может быть не связано:

В Reservation , тип id есть String , но в getId() вы указываете GenerationType.IDENTITY . AFAIK MySQL не поддерживает автоматическую генерацию идентификаторов строк, а только идентификаторы целых чисел. Удалите это и посмотрите, все ли работает.

Обновить:

Я воспроизвел ошибку на своем компьютере, и это действительно проблема. Если вы проверите свой вывод, вы обнаружите предупреждение (не ошибку), похожее на:

[Предупреждение об ошибке]: 2014-06-20 15:47:46.224—ServerSession(1565614310)—Исключение [EclipseLink-4002] (службы сохранения Eclipse — 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.Исключение DatabaseException Внутреннее исключение: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неверный спецификатор столбца для столбца ‘ID’ Код ошибки: 1063 Вызов: CREATE TABLE NEWENTITY (ID VARCHAR(255) AUTO_INCREMENT NOT NULL, ИМЯ VARCHAR(255), ПЕРВИЧНЫЙ КЛЮЧ (ID)) Запрос: DataModifyQuery(sql=»СОЗДАТЬ ТАБЛИЦУ NEWENTITY (ID VARCHAR(255) AUTO_INCREMENT NOT NULL, ИМЯVARCHAR(255), ПЕРВИЧНЫЙ КЛЮЧ (ИДЕНТИФИКАТОР))»)

Я полагаю, вы пропустили это, потому что это предупреждение, а не ошибка. Я также полагаю, что это выводится как предупреждение, а не ошибка, потому что иногда ошибка при создании таблицы не является проблемой (например, если таблица уже существует). EclipseLink, по-видимому, недостаточно умен, чтобы обрабатывать случаи, когда возникает истинная ошибка, поэтому он выдает предупреждение (см. «JPA отстой» выше).

Комбинация EclipseLink / MySQL не поддерживает тип генерации IDENTITY для идентификаторов строк. IDENTITY означает, что создание идентификатора зависит от базы данных (а не от поставщика реализации JPA). MySQL поддерживает только создание целочисленных идентификаторов, поэтому тип столбца должен быть целочисленным, если вы используете AUTO INCREMENT (см. Сгенерированный код).

Если вы действительно хотите, чтобы ваши идентификаторы были строкой, но также автоматически генерировали идентификатор, тогда используйте тип генерации AUTO . AUTO означает, что поставщик реализации JPA будет обрабатывать создание идентификаторов; EclipseLink будет использовать таблицу последовательностей и будет обрабатывать преобразование значений там в строку для вас.

Комментарии:

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

2. Спасибо, спасибо, спасибо и спасибо вам!!! Вы исправили мою проблему … теперь все работает…

3. @Mazzy: Рад помочь!

4. Мне действительно не повезло… проблемы снова здесь… но сейчас все по-другому

5. @Mazzy: В зависимости от того, что это такое, это, вероятно, новая проблема, поэтому может быть уместен новый вопрос.