使用Hibernate保存列表更改

时间:2012-10-08 08:35:21

标签: java database hibernate

我有一个名为Token的Object。它有id,name和value。将一些数据保存到db后,我已将它们加载到网页中

_____________________________________________
|____name____|____value____|____operation____|
   tkn1          10               ×
   tkn2          20               ×

×符号使我能够从服务器集合中删除令牌 现在。我添加了值为30的令牌tkn3并删除了tkn2 该表将是:

_____________________________________________
|____name____|____value____|____operation____|
   tkn1          10               ×
   tkn3          30               ×

通过对集合的这些更改,我如何将它们反映到数据库中 如何确定删除的记录,以及添加的记录?

我应用了两种解决方案:

  1. 我将业务逻辑层 - 旧数据与新数据进行了比较 并找到当时发送到数据库的两个列表之间的差异,第一个包含 添加的令牌,第二个包含要删除的令牌ID。
  2. 我在对象中添加了一个名为status的标志..当我添加标志时为NEW 当我删除时,我只将标志设置为DELETE,并在DB层中迭代集合 逐个对象并检查标志..如果NEW则添加记录,如果删除,则删除它 如果SAVED(没有变化)我没有改变它..
  3. 我的问题:

    • 这样做是不是很好..?
    • 是否有模式可以完成此任务?
    • Hibernate可以帮我这么做吗?

2 个答案:

答案 0 :(得分:1)

•这种方式做这个任务是好的吗? NO

•是否有模式可以完成此任务? 是

•Hibernate可以帮助我做到这一点吗? Hibernate使用Cascade Attribute for List属性

为这种情况提供解决方案

参考 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html

http://www.mkyong.com/hibernate/hibernate-cascade-example-save-update-delete-and-delete-orphan/

答案 1 :(得分:0)

打击实体应解决您的问题。

@Entity
public class MyEntity {

private static enum Status {
    NEW,
    PERSISTENT,
    REMOVED
}

@Id
private Long id;

private String name;
private int value;

@Transient
private Status uiStatus = Status.NEW;

public Long getId() {
    return this.id;
}

public String getName() {
    return this.name;
}

public Status getUiStatus() {
    return this.uiStatus;
}

public int getValue() {
    return this.value;
}

@PostLoad
public void onLoad() {
    this.uiStatus = Status.PERSISTENT;
}

public void setId(Long id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public void setUiStatus(Status uiStatus) {
    this.uiStatus = uiStatus;
}

public void setValue(int value) {
    this.value = value;
}
}