10

エンティティで文字列と列挙型のコレクションをマッピングする際に問題があります。私はさまざまなアドバイスに従いましたが、何もうまくいかないようです。PlayFramework 2.0 と提供されている Ebean を ORM として使用しています。

ここにイラストクラスがあります:

package models;

import java.util.*;
import javax.persistence.*;
import play.db.ebean.Model;

@Entity
@Table(name = "foo")
public class Foo extends Model {

    private static final long serialVersionUID = 1L;

    private enum FooBar {
        FOO, BAR;
    }

    @Id
    public Long id;

    @ElementCollection
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "bar_foobar", 
        joinColumns = @JoinColumn(name = "bar_id", 
            referencedColumnName = "id"))
    @Column(name = "foobar")
    public List<FooBar> fooBars;

    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "bar_strings", 
        joinColumns = @JoinColumn(name = "bar_id"))
    @Column(name = "string", nullable = false)    
    public List<String> listOfStrings;

    @Basic
    public List<String> listOfStrings2;

    // Attempt to circumvent the issue, but this gives a strange error
    //public String[] arrayOfString;
}

アプリケーションの起動時に生成される DDL は次のようになります。

create table foo (
id      bigint not null,
constraint pk_foo primary key (id))
;

注釈が正しければ、テーブルbar_foobarと作成中の両方が表示されると思います。bar_strings

変数を使用するarrayOfStringと、アプリケーションの起動時におかしなエラー メッセージが表示されます (これはランダムなエンティティに関連するものであり、必ずしも Foo.class とは限りません)

PersistenceException: Error with [models.user.User] 拡張されていませんが、スーパークラスの [class play.db.ebean.Model] は? (単一の継承階層に拡張機能を混在させることはできません) マーカー[play.db.ebean.Model] className[models.user.User]

Strings と Enums をエンティティでラップし、@ManyToMany 関係を使用できることはわかっていますが、それを考えると身震いします。Play 2.0 または Ebean (v2.7.3 を使用) にバグはありますか? 私の問題を解決できる他の方法はありますか?

4

2 に答える 2

1

Ebean では、コレクション マッピングはまだ実装されていません。EBEAN-378自分でマッピングを実装することしかできません。コレクションから削除された場合に文字列がDBに残らないようにするために、注釈を側で@PrivateOwned使用できます。Foo

于 2012-12-22T09:27:33.050 に答える
0

これは 2.0 の既知の問題 (リンク) ですが、2.0.1 で修正する必要があります。

編集:明確にするために、「これ」は PersistenceException を参照していました。

于 2012-05-06T11:39:52.663 に答える