2

我有一个客户表,其中有 3 列,即 id、name 和 age。

如果我创建一个没有年龄的客户对象,即我没有设置任何年龄值,那么如果表中存在相同的客户(由客户 ID 标识),则 saveOrUpdate() 将年龄列更新为 0。我我希望避免年龄列值被零或空值覆盖(如果表中已经存在)。例如,根据下面粘贴的代码片段,如果客户 ID 10 已经存在具有某些年龄值的行,那么在这种情况下,我的年龄不应该被零覆盖。

我在谷歌上搜索,发现我可以将 dynamicUpdate 设置为 true 来实现这一点。但是在执行代码时,我的年龄值仍然被 0 覆盖。我正在粘贴代码片段

@Entity
@Table(name = "CUSTOMER")
@org.hibernate.annotations.Entity(
        dynamicUpdate = true
)
public class Customer {

    @Id
    @GeneratedValue
    @Column(name = "CUSTOMER_ID")
    private int custId;

    @Column(name = "CUSTOMER_NAME")
    private String custName;

    @Column(name = "CUSTOMER_AGE")
    private int custAge;
        ............
        ...........

       Customer cust = new Customer();
       cust.setCustId(10);
       cust.setCustName("anand");       
       session.saveOrUpdate(cust);      
       tx.commit();
4

3 回答 3

4

要让 dynamicUpdate 工作,get 和 update 必须在同一个事务中。

于 2015-07-21T05:52:34.050 回答
0

第一:最好使用 anInteger而不是 anint作为 custAge 的类型。这样,您可以区分空值和有效 0 值。

然后,这dynamicUpdate = true对于您要执行的操作很有用,但您还需要将对象重新附加到会话(在更新情况下)。例如:

customer = session.get(Customer.class, id);
customer.set(...);
session.saveOrUpdate(customer);
于 2012-08-23T19:29:09.547 回答
0

动态更新仅在我们首先使用 session.get(...) 获取值时起作用。在这种情况下,假设我们有 10 列并且我们想要更新 5 列,然后首先我们使用 id 获取对象,然后将新值设置为获取的对象,然后它工作得很好更多我们只为5列编写编码,如果我们从那5列更新一列,然后使用动态更新查询触发,如下所示

休眠:更新用户管理员集名称=?user_id=?

下面是我的代码,在这里我只从前端改了名字

Session session = sessionFactory.openSession();
    Transaction tran = session.beginTransaction();
    Usermaster obj = (Usermaster) session.get(Usermaster.class,
            usermaster.getUserId());
    obj.setUsername(usermaster.getUsername());
    obj.setName(usermaster.getName());
    obj.setContact(usermaster.getContact());
    obj.setEmail(usermaster.getEmail());
    obj.setUserStatus(usermaster.getUserStatus());
    obj.setUserType(usermaster.getUserType());
    session.update(obj); 
于 2015-06-10T16:49:35.267 回答