【问题标题】:JPA table "sequence" does not existJPA 表“序列”不存在
【发布时间】:2012-02-04 09:29:53
【问题描述】:

数据库:

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 持久性服务 - 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 = ?绑定 => [2 参数绑定]查询:DataModifyQuery(name="SEQUENCE" sql="UPDATE 序列集 SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")

信息:错误:内部异常: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:表 'mazedb.sequence' 不存在错误代码:1146 调用:更新序列 SET SEQ_COUNT = SEQ_COUNT + ?哪里 SEQ_NAME = ?绑定 => [2 参数绑定]查询:DataModifyQuery(name="SEQUENCE" sql="UPDATE 序列集 SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")

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

【问题讨论】:

  • 嗯,消息说你需要一个序列表。你为什么不创建它?
  • 但是如果不应该有这张桌子,我为什么需要这张桌子呢?

标签: java jpa eclipselink


【解决方案1】:

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

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

【讨论】:

  • 给定的链接已失效。
  • 我必须创建表以节省其他人在谷歌上搜索的时间,这是 SQL CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(15), PRIMARY KEY (SEQ_NAME))
【解决方案2】:

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

【讨论】:

  • 为我工作,虽然我没有在 persistence.xml 中定义的第一个属性。添加建议属性消除了异常。
【解决方案3】:

在配置文件中,org.hibernate.dialect.oracle10gdialect 行可以忘记。确实,org.hibernate.dialect.mysqldialect 应该是。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      即使您使用@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>
        ...
      

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 2018-09-28
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 2018-12-03
        • 2012-07-25
        相关资源
        最近更新 更多