JPA表“序列”不存在

时间:2012-01-06 16:58:01

标签: java jpa eclipselink

数据库:

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 Call:UPDATE SEQUENCE   SET SEQ_COUNT = SEQ_COUNT +?在哪里SEQ_NAME =? bind => [2   参数bound]查询:DataModifyQuery(name =“SEQUENCE”sql =“UPDATE   SEQUENCE SET SEQ_COUNT = SEQ_COUNT +?在哪里SEQ_NAME =?“)

     

信息:错误:内部例外:   com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:表   'mazedb.sequence'不存在错误代码:1146 Call:UPDATE SEQUENCE   SET SEQ_COUNT = SEQ_COUNT +?在哪里SEQ_NAME =? bind => [2   参数bound]查询:DataModifyQuery(name =“SEQUENCE”sql =“UPDATE   SEQUENCE SET SEQ_COUNT = SEQ_COUNT +?在哪里SEQ_NAME =?“)

我尝试了另一种方法,让@PrimaryKeyJoinColumn合并了两个不同的实体,但我得到了同样的错误。

5 个答案:

答案 0 :(得分:14)

如果EclipseLink尝试访问此表,则意味着它应该在那里。 GenerationType.AUTO表示EclipseLink为您的数据库(MySQL)选择最合适的生成类型。在这种情况下,选择是使用基于表的生成器,它需要一个表。请参阅http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/GeneratedValue

如果您不想使用此策略,请选择其他策略。

答案 1 :(得分:5)

尽管做了一百次这样的事情,我之前从未遇到过这个错误。我发现这个错误是因为我有一个hibernate属性用于在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" -->

答案 2 :(得分:0)

@GeneratedValue(strategy=GenerationType.AUTO)看起来像IDE在实体创建时提供的默认值。但是,如果您使用的是org.eclipse.persistence.jpa.PersistenceProvider,则考虑到它处理此批注的方式(导致抛出异常), 最简单的解决方案是只使用@GeneratedValue(strategy=GenerationType.IDENTITY)

答案 3 :(得分:0)

即使您使用@GeneratedValue(strategy=GenerationType.IDENTITY),也会发生此异常!

来自EclipseLink Wiki

注意:IDENTITY策略是特定于数据库的,并非所有数据库都支持。在Sybase,DB2,SQL Server,MySQL,Derby,JavaDB,Informix,SQL Anywhere,H2,HSQL,Access和Postgres数据库上支持IDENTITY。

如上所述,我将数据库服务器和客户端从MySQL更改为MariaDB,GenerationType.IDENTITY不支持该数据库。 因此,我必须将以下属性添加到persistence.xml

<persistence ...
  <persistence-unit ...
  ...
  <properties>
    <property name="eclipselink.target-database" value="MySQL"/>
  </properties>
  ...

答案 4 :(得分:-1)

在配置文件中,org.hibernate.dialect.oracle10gdialect行可能会被遗忘。的确,org.hibernate.dialect.mysqldialect应该是。