簡體   English   中英

JPA表“序列”不存在

[英]JPA table "sequence" does not exist

數據庫:

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)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence .exceptions.DatabaseException 內部異常:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:表 'mazedb.sequence' 不存在 錯誤代碼:1146 調用:UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ? bind => [2 個參數綁定] 查詢:DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")

信息:錯誤:內部異常:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:表 'mazedb.sequence' 不存在 錯誤代碼:1146 調用:UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ? bind => [2 個參數綁定] 查詢:DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")

我嘗試了另一種方式,通過@PrimaryKeyJoinColumn 合並了兩個不同的實體,但我遇到了同樣的錯誤。

如果 EclipseLink 嘗試訪問此表,則意味着它應該在那里。 GenerationType.AUTO意味着 EclipseLink 為您的數據庫 (MySQL) 選擇最合適的生成類型。 在這種情況下,選擇是使用基於表的生成器,它需要一個表。 請參閱http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/GeneratedValue

如果您不想使用此策略,請選擇其他策略。

盡管做了一百次這種事情,但我之前從未出現過這種錯誤。 我發現這個錯誤是因為我有一個用於在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" -->

@GeneratedValue(strategy=GenerationType.AUTO)看起來像是 IDE 在創建實體時提供的默認值。 但是,如果您使用org.eclipse.persistence.jpa.PersistenceProvider ,考慮到它處理此注釋的方式(導致拋出異常),最簡單的解決方案是使用@GeneratedValue(strategy=GenerationType.IDENTITY)代替.

即使您使用@GeneratedValue(strategy=GenerationType.IDENTITY)也可能發生此異常!

EclipseLink 維基

注意: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>
  ...

在配置文件中, org.hibernate.dialect.oracle10gdialect行可以忘記。 確實, org.hibernate.dialect.mysqldialect應該是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM