dynamicUpdate在hibernate中不起作用

时间:2012-08-23 19:25:39

标签: java hibernate

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

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

我在google上搜索,发现我可以将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();

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

首先:最好使用Integer代替int作为custAge的类型。这样,您可以区分空值和有效值。

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

customer = session.get(Customer.class, id);
customer.set(...);
session.saveOrUpdate(customer);

答案 2 :(得分:0)

动态更新仅在我们首先使用session.get(...)获取值时才有效 在这种情况下假设我们有10列,我们想要更新5列然后首先我们使用id获取对象然后将新值设置为fetched对象,它工作正常 更多我们只编写5列编码,如果我们从该5列更新一列,则使用动态更新查询fire,如下所示

Hibernate:更新usermaster set name =? 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);