Вставка в спящий режим с проблемой таблицы с одним столбцом - PullRequest
2 голосов
/ 26 сентября 2011

Я использую Hibernate с базой данных SQLite. У меня есть следующий класс:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Authority {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int idAuthority;
(...)

Затем у меня есть класс Author, который расширяет полномочия и добавляет 4 или 5 полей. Когда я пытаюсь сохранить объект Author, Hibernate генерирует следующий запрос:

 Hibernate: insert into Authority values ( )

И sqlite это не нравится.

Если я добавлю фиктивное поле String, например «private String test», и установлю это свойство в конструкторе, все будет работать нормально.

Я совершенно новичок в спящем режиме, поэтому я не уверен, что делать дальше. У вас есть идеи?

Редактировать : В соответствии с запросом отображение класса Author:

@Entity
@Table(name="Authors")
@PrimaryKeyJoinColumn(name="idAuthority")
public class Author extends Authority {

    @Column(name = "firstName")
    protected String firstName;
    @Column(name = "lastName")
    protected String lastName;
    @Column(name = "alias")
    protected String alias;
(...)
}

Редактировать : По запросу (бис), вставить код:

public void save(Object data) {
     currentSession.saveOrUpdate(data);
}

Ничего особенного ... И чтобы дать вам больше потенциальных клиентов, вот схема базы данных:

create table Authority (idAuthority  integer, primary key (idAuthority))
create table Authors (alias varchar, firstName varchar, 
lastName varchar, idAuthority bigint not null, primary key (idAuthority))

N.B. : в SQLite целое число, являющееся первичным ключом, автоматически устанавливается равным AUTO-INCREMENT.

Возникло следующее исключение:

java.sql.SQLException: near ")": syntax error

Запрос должен быть больше похож на вставку в значения Authority (NULL), чтобы SQLite выполнял автоинкремент, а не эту странную «вставку в значения Authority ()».

Редактировать: Это определенно проблема с пакетом SqlLite для Hibernate. Я только что попробовал с Hsqldb, и он дает мне правильный запрос:

insert into Authority (idAuthority) values (default)

(Тогда это тоже не получается, но по совершенно другим причинам: p).

Я не уверен, что есть решение этой проблемы ... кроме использования другой БД.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

Попробуйте переопределить идентификатор.

@Entity
@Table(name="Authors")
@PrimaryKeyJoinColumn(name="idAuthority")
@AttributeOverride(name="idAuthority", column=@Column(name="id"))
public class Author extends Authority {

    @Column(name = "firstName")
    protected String firstName;
    @Column(name = "lastName")
    protected String lastName;
    @Column(name = "alias")
    protected String alias;
    (...)

}

0 голосов
/ 26 сентября 2011

Если вы используете InheritanceType.JOINED, ваша таблица, связанная с классом Authority, должна содержать столбец, связанный с idAuthority, а ваша таблица, связанная с классом Author, должна содержать столбец, связанный с idAuthority, который является внешним ключом первичного идентификатора в таблице, представляющей Authority.Требуется для связи табличных отношений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...