2013-12-11 2 views
0

У меня проблема с Hibernate 4.2.7.SP1, и я не знаю, является ли это неправильным использованием или ошибкой. Я использую спящий режим с аннотациями и мой код похож на этих двух объектах:Почему hibernate пытается выполнить искаженный запрос?

Первый объект:

@Entity 
@Table(name = "TABLE1") 
public class FirstObject { 
    @Id 
    @GeneratedValue 
    private Long id; // database id 

    private SecondOBject secondObject 

    //Getters, setters and other stuff here. 
} 

Второй объект:

@Entity 
@Table(name = "TABLE2") 
public class SecondObject { 
    @Id 
    @GeneratedValue 
    private Long id; // database id. 

    @ElementCollection 
    @CollectionTable(name = "T_MAPTABLE") 
    private Map<String, Integer> iAmAHashmap; 

    //More maps similar to the previous one, the getters, setters and other stuff. 
} 

Конечно много кода опущена, потому что Я думаю, что это не имеет отношения к вопросу.

Когда я выполнить тест, где я создаю объект «FirstObject» с «SecondObject» и попытаться упорствовать его спящий режим, я могу видеть, что спящий режим генерирует этот SQL-код:

Hibernate: 
insert 
into 
    TABLE2 

values 
    () 

As вы можете видеть, нет параметров и ни значений. Таким образом, исключение запускается:

SqlExceptionHelper [main] - [SQLITE_ERROR] SQL error or missing database (near ")": syntax error) 

Карта в SecondObject имеет значения (я напечатал размер карты, чтобы убедиться). Но Hibernate не сохраняет его и пытается сохранить пустые параметры в TABLE2.

Но, если изменить SecondObject и добавить любой параметр (то есть строку):

@Entity 
@Table(name = "TABLE2") 
public class SecondObject { 
    @Id 
    @GeneratedValue 
    private Long id; // database id. 

    private String dummyText="hello!"; 

    @ElementCollection 
    @CollectionTable(name = "MAPTABLE") 
    private Map<String, Integer> iAmAHashmap; 

    //More maps similar to the previous one, the getters, setters and other stuff. 
} 

Код, сгенерированный Hibernate является:

Hibernate: 
insert 
into 
    TABLE2 
    (dummyText) 
values 
    (?) 

И по крайней мере, никаких ошибок не показывается (но, очевидно, карта не вставлена).

у меня в hibernate.cfg.xml:

.... 
    <property name="hibernate.hbm2ddl.auto">create-drop</property> 
.... 

И MAPTABLE создается автоматически при выполнении теста.

Тогда у меня есть два вопроса:

Почему Гибернация пытается выполнить запрос без параметров и значений? Почему моя карта не вставлена? (У меня есть эта ошибка во всех моих классах, у которых есть только Карты и другие параметры).

+0

Ах! И я пытаюсь упорствовать в базе данных SQLite ... – JorgeHortelano

ответ

1

Я не знаю, опустили ли вы его, как FirstObject < -> SecondObject - это отношения с внешним ключом внутри db, вам нужно указать, что с аннотациями. Здесь вы можете найти примеры для разных типов отношений с примерами и дополнительными пояснениями: http://en.wikibooks.org/wiki/Java_Persistence/Relationships

OneToOne-Relationship будет выглядеть так, чтобы JPA знал, что такое внешний ключ.

@OneToOne 
@JoinColumn(name="ID") 
private SecondObject secondObject; 

То же самое относится и к коллекции: http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection CollectionTable-аннотаций имеет атрибут joinColumn для указания внешнего ключа.

+0

Вы правы. Я был смущен ошибкой, и я искал решение в другом месте.Это было так просто, как я забыл JoinColumn. – JorgeHortelano

+0

Но я до сих пор не понимаю, почему hibernate пытается выполнить искаженный SQL-запрос. Это вызвало у меня столько путаницы! – JorgeHortelano

+0

Я бы предположил, потому что, насколько я понимаю ваше описание SecondObject, он состоит только из идентификатора и коллекций, данные которых находятся в другой таблице. Таким образом, на самом деле нет данных для вставки в таблицу, кроме идентификатора, но поскольку это, вероятно, создается базой данных, Hibernate/JPA не имеет столбцов для заполнения, но все равно необходимо каким-то образом создать новую строку, которая сможет получить сгенерированный идентификатор. Это будет особый случай, который не покрывается ни JPA, ни SQL, поскольку SecondObject кажется бесполезным слоем между FirstObject и коллекциями SecondObject. – dkaisers

Смежные вопросы