![](/img/trans.png)
[英]JPA (Hibernate): “ORA-02289 Sequence does not exist”, but it does
[英]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)
也可能發生此異常!
注意: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.