1

アプリケーションにSpringとHibernateを使用しています。

フィールド isActive=false を設定する必要があるアプリケーションでのみ、論理的な削除を許可しています。すべてのエンティティで同じフィールドを繰り返す代わりに、「isActive」のプロパティと getter-setter を持つ基本クラスを作成しました。

そのため、削除中に update() メソッドを呼び出し、isActive を false に設定します。

私はこれを機能させることができません。誰かが何か考えを持っているなら、私に知らせてください。

ベースエンティティ

public abstract class BaseEntity<TId extends Serializable> implements IEntity<TId> {

    @Basic
    @Column(name = "IsActive")
    protected boolean isActive;

    public Boolean getIsActive() {
        return isActive;
    }

    public void setIsActive(Boolean isActive) {
        isActive= isActive;
    }
}

子エンティティ

@Entity(name="Role")
@Table(schema = "dbo")
public class MyEntity extends BaseEntity {
    //remaining entities
}

Hibernate Util クラス

public void remove(TEntity entity) {

    //Note: Enterprise data should be never removed.
    entity.setIsActive(false);
    sessionFactory.getCurrentSession().update(entity);
}
4

3 に答える 3

3

setIsActiveメソッドのコードを次のものに置き換えてみてください。

public void setIsActive(Boolean isActive) {
    this.isActive = isActive;
}

あなたのコードでは、変数名を使用しないthisとあいまいになる可能性があります...

@MappedSuperclassフィールドの継承を実現するには、抽象クラスにも注釈を追加する必要があると思います。

于 2014-06-04T13:02:03.853 に答える
0

提案されたソリューションの問題(その回答へのコメントで言及されています)は、カスケード削除を処理しないことです。

別の (Hibernate 固有の非 JPA) ソリューションは、Hibernate の @SQLDelete アノテーションを使用することです。

http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/querysql.html#querysql-cud

ただし、この注釈はスーパークラスでは定義できず、各エンティティ クラスで定義する必要があることを思い出したようです。

ただし、一般的な論理削除の問題は、これらのレコードを除外するために、すべてのクエリとすべてのコレクション マッピングをフィルター処理することを覚えておく必要があることです。

私の意見では、より良い解決策は、論理的な削除を完全に忘れることです。Hibernate Envers を監査メカニズムとして使用します。その後、必要に応じて、削除されたレコードを回復できます。

http://envers.jboss.org/

于 2014-06-04T13:49:18.487 に答える
0

SQLDelete アノテーションを使用できます...

@org.hibernate.annotations.SQLDelete;

//Package name...

//Imports...

@Entity
@Table(name = "CUSTOMER")
//Override the default Hibernation delete and set the deleted flag rather than deleting the record from the db.
@SQLDelete(sql="UPDATE customer SET deleted = '1' WHERE id = ?")
//Filter added to retrieve only records that have not been soft deleted.
@Where(clause="deleted <> '1'")
public class Customer implements java.io.Serializable {
private long id;
...
private char deleted;

ソース: http://featurenotbug.com/2009/07/soft-deletes-using-hibernate-annotations/

于 2016-03-24T02:27:43.753 に答える