1

奇妙な問題があります。私は ebeans (=> mysql) で play 2.1-SNAPSHOT を使用しています。非常に小さな (テスト) セットアップを使用していますが、何らかの理由でデータベースの更新と削除が機能しません。DB にアイテムが作成されますが、更新が機能しません。

これが私のBeanです(タイムスタンプ(作成日と変更日)を追加するスーパークラスを拡張します):

AbstractTimestamp (スーパークラス):

@MappedSuperclass
public abstract class AbstractTimestampedBean extends AbstractIdentifiableBean {
    /** The date this item has been created. */
    @CreatedTimestamp
    public Timestamp createdTime;
}

Project Bean (重要でないものを削除) - hashCode と equals は Eclipse によって作成されました - ここでは、play.db.ebean.Model のメソッドを上書きします。

@Entity
@Table(name = "Projects")
public class Project extends AbstractTimestampedBean {

    private static final long serialVersionUID = -6160140283947231026L;

    @NotNull
    public String title;

    @NotNull
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public User owner;

    @NotNull
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public User creator;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public Set<User> participants;

    @EnumMapping(nameValuePairs = "ACTIVE=A,INACTIVE=I,EXPIRED=E")
    public enum Status {
        ACTIVE, INACTIVE, EXPIRED
    }

    public Project() {
    }

    public Project(final String title, final User creator) {
        this.title = title;
        this.creator = creator;
        this.owner = creator;
    }

    /*
     * (non-Javadoc)
     * 
     * @see play.db.ebean.Model#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result
                        + (this.creator == null ? 0 : this.creator.hashCode());
        result = prime * result
                        + (this.owner == null ? 0 : this.owner.hashCode());
        result = prime * result
                        + (this.participants == null ? 0 : this.participants
                                        .hashCode());
        result = prime * result
                        + (this.title == null ? 0 : this.title.hashCode());
        return result;
    }

    /*
     * (non-Javadoc)
     * 
     * @see play.db.ebean.Model#equals(java.lang.Object)
     */
    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (this.getClass() != obj.getClass()) {
            return false;
        }
        final Project other = (Project) obj;
        if (this.creator == null) {
            if (other.creator != null) {
                return false;
            }
        } else if (!this.creator.equals(other.creator)) {
            return false;
        }
        if (this.owner == null) {
            if (other.owner != null) {
                return false;
            }
        } else if (!this.owner.equals(other.owner)) {
            return false;
        }
        if (this.participants == null) {
            if (other.participants != null) {
                return false;
            }
        } else if (!this.participants.equals(other.participants)) {
            return false;
        }
        if (this.title == null) {
            if (other.title != null) {
                return false;
            }
        } else if (!this.title.equals(other.title)) {
            return false;
        }
        return true;
    }

非常に単純なテストケースは次のとおりです。

最初の実行でプロジェクトが作成されます - そこにあることを確認します (ここでは何も失敗しません)

次に、いくつかのものを更新して保存し、再度アサートします...ここで、db エントリが更新されていないことがわかります。

http://pastebin.com/7zdzWGXw

ここで使用しているスーパークラスは次のとおりです。

public abstract class AbstractPersistableTestCase {
    @Transactional
    void saveBean(final Model bean) {
        Ebean.save(bean);
    }

    @Transactional
    void deleteBean(final Model bean) {
        Ebean.delete(bean);
    }

    @Transactional
    <T extends Model> void deleteBeans(final List<T> beans) {
        Ebean.delete(beans);
    }
}

jUnit4 からのエラー メッセージ:

これは、更新の場合のタイトルの主張です => 参照: db エントリが更新されていません:

[error] Test test.models.ProjectTest.createAndUpdateProject failed: expected:<'Project_[NEW_]1350681993608'> but was:<Project_[]1350681993608'>

これは、プロジェクトを削除しようとすると発生します:

[error] Test test.models.ProjectTest.deleteProjects failed: Data has changed. updated [0] rows sql[delete from user where id=? and name is null and email is null and created_time is null] bind[null]

なぜこれが起こっているのか分かりますか?ここは本当にイライラします...

よろしく、

サーシャ

4

1 に答える 1

0

クラスにIDを追加していないようです。

これをスーパークラスに追加してみてください。

@MappedSuperclass
public abstract class AbstractModel extends play.db.ebean.Model
{
    @Id
    public Long id;

    public Long getId()
    {
        return id;
    }

    // ... here your other attributes
}
于 2012-10-26T11:28:21.370 に答える