java JPA EclipseLink DatabaseException: 'table foo.SEQUENCE 不存在'
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11671186/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JPA EclipseLink DatabaseException: 'table foo.SEQUENCE doesn't exist'
提问by Thufir
I've updated the question so that bothtables now use auto-increment. Is perhaps the problem in persisting to the MESSAGES
table a problem with the database schema?
我已经更新了问题,以便两个表现在都使用自动增量。持久化到MESSAGES
表的问题可能是数据库模式的问题吗?
In trying to persist a MessageBean as so:
在尝试这样持久化 MessageBean 时:
private void persist(MessageBean messageBean) throws Exception {
LOG.info("loading.." + messageBean);
Messages message = new Messages(messageBean);
emf = Persistence.createEntityManagerFactory("USENETPU");
em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(message);
em.getTransaction().commit();
}
Stack trace:
堆栈跟踪:
run:
Jul 27, 2012 3:04:06 PM net.bounceme.dur.usenet.controller.CommentsDefaultListModel persist
INFO: loading..floor installer (cultas lake)
[EL Info]: 2012-07-27 15:04:10.006--ServerSession(30409723)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
[EL Info]: 2012-07-27 15:04:11.78--ServerSession(30409723)--file:/home/thufir/NetBeansProjects/USENET/build/classes/_USENETPU login successful
[EL Warning]: 2012-07-27 15:04:12.072--ClientSession(29574192)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'nntp.SEQUENCE' doesn't exist
Error Code: 1146
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")
Jul 27, 2012 3:04:12 PM net.bounceme.dur.usenet.controller.CommentsDefaultListModel <init>
SEVERE: null
Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'nntp.SEQUENCE' doesn't exist
Error Code: 1146
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?")
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
From MySql:
来自 MySql:
mysql>
mysql>
mysql> show tables;
+----------------+
| Tables_in_nntp |
+----------------+
| comments |
| messages |
+----------------+
2 rows in set (0.00 sec)
mysql>
mysql> show create table comments;
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| comments | CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message_id` int(11) NOT NULL,
`comment` text NOT NULL,
`stamp` date NOT NULL,
PRIMARY KEY (`id`),
KEY `message_id` (`message_id`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`message_id`) REFERENCES `messages` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
mysql> show create table messages;
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| messages | CREATE TABLE `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`newsgroup` text NOT NULL,
`subject` text NOT NULL,
`content` text NOT NULL,
`number` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
and the fields for Messages:
和消息字段:
package net.bounceme.dur.usenet.controller;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
@Entity
@Table(name = "messages", catalog = "nntp", schema = "")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Messages.findAll", query = "SELECT m FROM Messages m"),
@NamedQuery(name = "Messages.findById", query = "SELECT m FROM Messages m WHERE m.id = :id")})
public class Messages implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id", nullable = false)
@GeneratedValue
private Integer id;
@Basic(optional = false)
@Lob
@Column(name = "newsgroup", nullable = false, length = 65535)
private String newsgroup;
@Basic(optional = false)
@Lob
@Column(name = "subject", nullable = false, length = 65535)
private String subject;
@Basic(optional = false)
@Lob
@Column(name = "content", nullable = false, length = 65535)
private String content;
@Basic(optional = false)
@Lob
@Column(name = "number", nullable = false, length = 65535)
private String number;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "messageId")
private Collection<Comments> commentsCollection;
public Messages() {
}
And the Comments fields:
和评论字段:
package net.bounceme.dur.usenet.controller;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "comments", catalog = "nntp", schema = "")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Comments.findAll", query = "SELECT c FROM Comments c"),
@NamedQuery(name = "Comments.findById", query = "SELECT c FROM Comments c WHERE c.id = :id"),
@NamedQuery(name = "Comments.findByStamp", query = "SELECT c FROM Comments c WHERE c.stamp = :stamp")})
public class Comments implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id", nullable = false)
@GeneratedValue
private Integer id;
@Basic(optional = false)
@Lob
@Column(name = "comment", nullable = false, length = 65535)
private String comment;
@Basic(optional = false)
@Column(name = "stamp", nullable = false)
@Temporal(TemporalType.DATE)
private Date stamp;
@JoinColumn(name = "message_id", referencedColumnName = "id", nullable = false)
@ManyToOne(optional = false)
private Messages messageId;
public Comments() {
}
回答by Dewfy
For mysql
I would recommend you following:
因为mysql
我会推荐你以下:
At you table messages
at field id
add declaration auto_increment
:
在你的表messages
字段id
添加声明auto_increment
:
create table messages(
...
id int not null auto_increment,
...
primary key (id)
)
At entity declaration use
在实体声明中使用
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
This talks to JPA use auto-increment feature of MySQL
这与 JPA 使用 MySQL 的自动增量功能交谈
If it is not applicable (for example you may want to create related another entity in the same transaction) use TABLE strategy (for more details see http://www.objectdb.com/java/jpa/entity/generated)
如果它不适用(例如,您可能希望在同一事务中创建相关的另一个实体),请使用 TABLE 策略(有关更多详细信息,请参见http://www.objectdb.com/java/jpa/entity/generated)
回答by JB Nizet
The AUTO strategy is an alias for NATIVE if your database supports it, or SEQUENCE if your database supports it, or TABLE if your database doesn't support any of those.
如果您的数据库支持,则 AUTO 策略是 NATIVE 的别名,如果您的数据库支持,则为 SEQUENCE,如果您的数据库不支持其中任何一项,则为 TABLE。
So if the database doesn't support NATIVE and SEQUENCE, then you need to create the table that EclipseLink uses to generate IDs.
因此,如果数据库不支持 NATIVE 和 SEQUENCE,那么您需要创建 EclipseLink 用来生成 ID 的表。
With MySQL, NATIVE should be supported. You need to make the ID column an auto_increment column, though. Make sure to configure the appropriate DatabasePlatformas well.
对于 MySQL,应该支持 NATIVE。不过,您需要将 ID 列设为 auto_increment 列。确保也配置适当的DatabasePlatform。