JPA таблицы "последовательность" не существует - PullRequest
9 голосов
/ 06 января 2012

База данных:

user_account
id(pk)
email
password
...

user_detail
id(pk fk)
name_first
name_last
...

Сущность

@Entity
@Table(name="user_account")     
@SecondaryTable(name="user_detail", pkJoinColumns=@PrimaryKeyJoinColumn())
public class UserAccount implements Serializable{
    private static final long serialVersionUID = -2606506548742732094L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String email;
    private String password;
    private String tab;
    private String shortcut;
    private String setting;
    private Integer role;

    @Column(table="user_detail", name="name_first")
    private String nameFirst;
    @Column(table="user_detail", name="name_last")
    private String nameLast;
    @Column(table="user_detail")
    private String occupation;
    @Column(table="user_detail")
    @Temporal(TemporalType.DATE)
    private Date birth;
    ....
}

Действие

    try{
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        em.persist(currentUser);

        transaction.commit();
    } catch (Exception e){
    }

Ошибка

ИНФОРМАЦИЯ: [EL Предупреждение]: 2012-01-06 18: 45: 46.77 - ClientSession (17472935) - Исключение [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: таблица 'mazedb.sequence' не существует Код ошибки: 1146 Вызов: ОБНОВИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ SET SEQ_COUNT = SEQ_COUNT +?ГДЕ SEQ_NAME =?bind => [2 параметра связаны] Запрос: DataModifyQuery (name = "SEQUENCE" sql = "ОБНОВЛЕНИЕ SEQUENCE SET SEQ_COUNT = SEQ_COUNT +? WHERE SEQ_NAME =?")

INFO: ОШИБКА: Внутреннее исключение: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: таблица 'mazedb.sequence' не существует Код ошибки: 1146 Вызов: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT +?ГДЕ SEQ_NAME =?bind => [2 параметра связаны] Запрос: DataModifyQuery (name = "SEQUENCE" sql = "ОБНОВЛЕНИЕ SEQUENCE SET SEQ_COUNT = SEQ_COUNT +? WHERE SEQ_NAME =?")

Я пробовал другой способ,при объединении двух разных сущностей с помощью @PrimaryKeyJoinColumn, но я получил ту же ошибку.

Ответы [ 4 ]

14 голосов
/ 06 января 2012

Если EclipseLink пытается получить доступ к этой таблице, это означает, что она должна быть там.GenerationType.AUTO означает, что EclipseLink выбирает наиболее подходящий тип генерации для вашей базы данных (MySQL).В этом случае выбор состоит в том, чтобы использовать основанный на таблице генератор, которому нужна таблица.См. http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/GeneratedValue.

Если вы не хотите использовать эту стратегию, выберите другую.

5 голосов
/ 18 сентября 2013

У меня никогда не было этой ошибки прежде, несмотря на то, что я делал подобные вещи сто раз. Я обнаружил эту ошибку, потому что у меня было свойство гибернации для создания таблиц в persistence.xml, но я использовал EclipseLink:

Было:

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

Я изменил следующее, чтобы исправить ошибку:

    <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    <!-- or just value="create-tables" -->
0 голосов
/ 06 июля 2019

@GeneratedValue(strategy=GenerationType.AUTO) выглядит как значение по умолчанию, предоставляемое IDE при создании объекта.Однако, если вы используете org.eclipse.persistence.jpa.PersistenceProvider, учитывая то, как он обрабатывает эту аннотацию (что приводит к выдаче исключения), простейшим решением будет просто использовать @GeneratedValue(strategy=GenerationType.IDENTITY).

0 голосов
/ 02 ноября 2015

В файле конфигурации, строка org.hibernate.dialect.oracle10gdialect может быть забыта.Действительно, org.hibernate.dialect.mysqldialect должно быть.

...