我有一个客户表,其中有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();
答案 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);