2012-03-15 15 views
0

私はmysqlとecliselink.Iを使用してJPAベースのアプリケーションを構築しています。データベースにデータを挿入しようとすると非常に奇妙な問題があります。データを1つのテーブルに挿入できますが、私は2つのメインテーブルと1つの参照テーブルを持っています(それは他の2つのテーブルの外部キーを保持しています)。私はデータベーステーブルに "シーケンス"を持っていないので変ですデータを挿入しようとすると私のテーブルのいずれかに私は、この例外を取得:他の人が非常に似ているという理由だけで、私は1つのクラスを掲載していますJPA/MySqlの問題

[EL Info]: 2012-03-15 17:52:28.64--ServerSession(18621340)--EclipseLink, version: Eclipse Persistence Services - 2.3.2.v20111125-r10461 
[EL Info]: 2012-03-15 17:52:29.23--ServerSession(18621340)--file:/D:/git-eclipse/Martin/reference/build/classes/_reference login successful 
[EL Warning]: 2012-03-15 17:52:29.389--ClientSession(31843177)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'eclipse1.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 = ?") 

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'eclipse1.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 = ?") 
[EL Info]: 2012-03-15 17:52:29.394--ServerSession(18621340)--file:/D:/git-eclipse/Martin/reference/build/classes/_reference logout successful 
Exception in thread "main" java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager. 
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpen(EntityManagerImpl.java:1665) 
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.close(EntityManagerImpl.java:1529) 
at OneToManyRelation.main(OneToManyRelation.java:47) 

@Entity 

    @Table(name="category") 

    public class Category { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="CategoryID") 
    private int CategoryID; 

/** 
* @return the id 
*/ 
public int getId() { 
return CategoryID; 
} 

/** 
* @param id the id to set 
*/ 
public void setId(int CategoryID) { 
this.CategoryID = CategoryID; 
} 

@Column(name="category", nullable=false, length=50, insertable=true) 
private String category; 

/** 
* @return the category 
*/ 
public String getCategory() { 
return category; 
} 


public void setCategory(String category) { 
this.category = category; 
} 

@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "templateemail", joinColumns = { 
@JoinColumn(name="categoryId", unique = true) 
}, 
inverseJoinColumns = { 
@JoinColumn(name="templateId") 
} 
) 
private Set<Template> template; 

/** 
* 
*/ 
public Set<Template> getChildren() { 
return template; 
} 

/** 
* 
*/ 
public void setChildren(Set<Template> template) { 
this.template = template; 
} 

} 

私のコードに何が悪いと思いますか?コードを見て事前に

おかげ

+0

コードをお願いします。ありがとうございます。 – Woot4Moo

+0

@Martinあなたの投稿した内容はあなたのコードではありません。だから、どうしたらそれが間違っているのか分かりますか? –

+0

申し訳ありません私はここでかなり新しい、私は私の質問を改善するために全力を尽くします –

答えて

2

はそれで間違っているものを見つけるのに役立つだろう。しかし、エラーメッセージのみで判断すると、シーケンスまたはテーブルジェネレータを使用するように選択されているようで、このジェネレータはデータベースに存在しないsequenceというテーブルに(デフォルトで)依存します。

このテーブルを作成するか、または既存のテーブルを使用するようにジェネレータを設定するか、IDジェネレータを変更します。

+0

ここに私のクラスです –

+0

私の答えは同じです。必要なテーブルを作成するか、必要なものを実行するジェネレータを設定します。 JPAがデータベース内のシーケンス、テーブル、または自動インクリメントフィールドなしでIDを生成することを望んでいるようです。必要な戦略を選択し、この戦略をサポートするためにデータベースに必要なテーブルや列を作成します。 –

+1

@JBNizetが正しいです。 EclipseLinkのドキュメントでは、「AUTOの戦略を指定すると、EclipseLinkで使用する戦略を選択できます。一般的に、EclipseLinkは最も移植性の高い戦略であるため、TABLEを戦略として選択しますが、AUTOを指定すると、データベース内にデフォルトテーブルが作成されるようにします。 (http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey) – madth3