3

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

_____________________________________________
|____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 那么添加记录,如果 DELETE ,删除它,如果 SAVED (没有更改)我不做任何更改..

我的问题:

  • 这种方式是否适合完成这项任务..?
  • 是否有模式来完成这项任务?
  • Hibernate 可以帮助我做到这一点吗?
4

2 回答 2

1

• 这种方式是否适合完成这项任务..?不

• 是否有模式来完成这项任务?是的

• Hibernate 可以帮助我做到这一点吗?Hibernate 使用 List 属性的 Cascade Attribute 为这种情况提供了解决方案

参考 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/

于 2012-10-08T08:48:03.827 回答
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;
}
}
于 2012-10-09T07:23:47.403 回答