奇妙な問題があります。私は 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 エントリが更新されていないことがわかります。
ここで使用しているスーパークラスは次のとおりです。
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]
なぜこれが起こっているのか分かりますか?ここは本当にイライラします...
よろしく、
サーシャ