2015-07-30 6 views
0

Вот исключение я получаю:JPA EclipseLink Исключение [EclipseLink-4002]

[EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): 
org.eclipse.persistence.exceptions.DatabaseException Internal Exception: 
java.sql.SQLSyntaxErrorException: Vergleiche zwischen 'BIGINT' und 'VARCHAR (UCS_BASIC)' 
werden nicht unterstützt. 

Error Code: 30000 
Call: SELECT t1.ID, t1.TEXTINFO FROM COORDINATESLOCATION_INFORMATION t0, TEXTINFORMATION t1 
WHERE ((t0.CoordinatesLocation_ID = ?) AND (t1.ID = t0.informationList_ID)) 
bind => [1 parameter bound] 

Когда я запускаю мое приложение первой (без пустой базы данных) все работает. Я легко могу управлять данными во всех функциях CRUD. Позже (после неспецифического времени или нескольких запросов) появляется исключение.

Это туристическое информационное приложение. Есть авторы, которые создают туры. Один тур содержит много мест. В одном месте содержится много информации. Ассоциации реализуются как композиции.

Поскольку я изменил каждую ассоциацию на ожидающую выборку, исключение появляется ранее в рабочем процессе.

Вот фрагменты кода:

@Entity 
    public class CoordinatesLocation implements Serializable{ 

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

    private String name; 
    private String description; 
    @OneToMany(fetch = FetchType.EAGER) 
    private List<Information> informationList = new ArrayList<>(); 
    private double lat; 
    private double lng; 
    } 

    @Entity 
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
    public abstract class Information implements Serializable { 

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

    @Entity 
    public class TextInformation extends Information { 

    private String textInfo; 
    } 

Plus геттер & сеттер!

Спасибо за помощь!

+0

cab91 - можете ли вы размещать свои объекты в COORDINATESLOCATION_INFORMATION и TEXTINFORMATION, в частности, отношения? – NickJI

+0

Объекты добавлены знаете – cab91

ответ

0

С кодом, который вы предоставили, я могу воссоздать проблему в EclipseLink. Сгенерированный скрипт;

CREATE TABLE COORDINATESLOCATION_INFORMATION (CoordinatesLocation_ID BIGINT 
NOT NULL, informationList_ID VARCHAR(255) NOT NULL, PRIMARY KEY 
(CoordinatesLocation_ID, informationList_ID)) 

Я попытался явно определить столбцы таблицы соединений;

@OneToMany(fetch = FetchType.EAGER) 
    @JoinTable (name = "COORDINATESLOCATION_INFORMATION", 
      joinColumns = @JoinColumn(name = "CoordinatesLocation_ID", referencedColumnName = "ID"), 
      inverseJoinColumns = @JoinColumn(name = "Information_ID",referencedColumnName = "ID")) 
private List<Information> informationList; 

... но все равно получить VARCHAR (255).

Я удалил

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 

Из Information класса (так нарушившего к SINGLE_TABLE стратегии), и это приводит к желаемому сценарию:

CREATE TABLE COORDINATESLOCATION_INFORMATION (CoordinatesLocation_ID BIGINT NOT 
NULL, informationList_ID BIGINT NOT NULL, PRIMARY KEY (CoordinatesLocation_ID, 
informationList_ID)). 

Итак, после этого несколько эмпирического анализа (I «Не знаю, почему идентификатор был сопоставлен с типом VARCHAR (255)), у вас есть несколько вариантов.

  1. Измените сценарий CREATE TABLE COORDINATESLOCATION_INFORMATION, чтобы включить информациюList_ID BIGINT.
  2. Изменить на @Inheritance (strategy = InheritanceType. SINGLE_TABLE). Это требует добавления столбца дискриминатора и может не соответствовать вашему подходу.

Отметим также, что с @OneToMany вам не нужно вступать в таблицу, если добавить внешний ключ в вашей информационной таблице и определить @ManyToOne на стороне информационного и @OneToMany на стороне CoordinatesLocation с mappedBy Attribute.

Эта ссылка даст некоторое представление об этом. https://en.wikibooks.org/wiki/Java_Persistence

0

Я не могу прочитать локализованное сообщение в вашем исключении, однако я предполагаю, что он говорит, что вы не можете сравнить bigint и varchar. Я также предполагаю, что ошибка находится в этой части SQL: (t1.ID = t0.informationList_ID). Является ли один из этих столбцов bigint, а другой - varchar?

+0

Я использовал тип данных «Длинный» во всех сущностях. Идентификатор автоматически генерируется. Я не знаю, какой тип t0.informationList_ID имеет, поскольку он был сгенерирован JPA. – cab91

+0

О, хорошо. Я вижу, что t1.ID - это BIG INT, а t0.informationList_ID - VARCHAR. Но как я могу сказать JPA для создания таблицы assoziation с типом BIGINT? – cab91

+0

Я не знаю; Я использовал JPA, но сам создал свои таблицы. Я не работал с созданием таблицы EclipseLink. – dsh

0

в основном здесь t0.CoordinatesLocation_ID =? в какой-то момент ваш параметр имеет тип BIGINT, а запрошенный тип - VARCHAR, вы должны посмотреть на это