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
}

休眠实用程序类

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 回答