親愛なるプログラマーの皆さん、私は次のことを支援するためにあなたのところに来ました:
アプリケーションの ORM として EclipseLink を使用しており、エンティティ (記事) の 1 つにソフト削除を実装し、OneToMany 関係を持つカテゴリが削除されたときにこれらの記事をカスケード削除しようとしています。
記事を削除するとすべてが期待どおりに機能しますが、記事が n 個あるカテゴリを削除すると例外が発生します。DescriptorCustomizer を使用してソフト削除を実行しています。
次の実装を持つDescriptorCustomizer ( org.eclipse.persistence.config.DescriptorCustomizerを参照):
public class ArticleCustomizer implements DescriptorCustomizer {
@Override
public void customize(ClassDescriptor classDescriptor) throws Exception {
classDescriptor.getQueryManager().setDeleteSQLString("UPDATE article SET ACTIVE = '0' WHERE id = #id");
}
}
保存しようとしているエンティティ:
AbstractItem
@Entity
@Table(name = "item")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractItem extends BaseEntity {
@ManyToOne
protected Category category;
}
論文
@Entity
@DiscriminatorValue("article")
@Customizer(value=ArticleCustomizer.class)
public class Article extends AbstractItem {
}
カテゴリー
@Entity
@Customizer(value=CategoryCustomizer.class)
public class Category extends BaseEntity {
@OneToMany(cascade = CascadeType.REMOVE)
@JoinTable(name = "category_items", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "item_id"))
protected List<AbstractItem> items = new ArrayList<AbstractItem>();
@OneToMany(cascade = CascadeType.REMOVE)
@JoinTable(name = "category_subcategories", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "parent_category_id"))
protected List<Category> categories = new ArrayList<Category>();
}
n 個の記事を持つカテゴリをカスケード削除しようとすると、次のエラーが表示されます。
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'ACTIVE' in 'field list'
Error Code: 1054
Call: UPDATE article SET ACTIVE = '0' WHERE id = ?
bind => [null]
ID が null にバインドされていることがわかりますが、その理由はわかりません。誰かが私を正しい方向に導いてくれますか?
- Eclipselink バージョン: 2.4.0
- 春: 3.1.2RELEASE
ありがとうございました!