2011-07-22 140 views
7

一个对象的字段我有一个object A映射到table A在DB更新在休眠

class A { 
    Integer id; 
    String field2,field2;field3 ,... fieldN; 
    //lots of other attribute 
} 

现在我想要写一个DAO API,仅仅更新单个field.One办法是,我可以第一加载那么对象改变我需要的属性,然后使用合并API

//start transcation 
A a = session.load(A.class, id); 
A.setfieldP(newValue) 
session.merge(A) 
//commit transcation 

现在,如果我用下面的代码

//start transcation 
A a = new A(); 
a.setId(id); //set a id by which object A exists in DB 
A.setfieldP(newValue) 
session.merge(A) 
//commit transaction 

现在第二种方法除id和fieldP之外的所有字段设置为空

1)现在还有其他方法吗?
2)我可以使用更新而不是合并?

回答

2

我通常喜欢session.get VS session.load,作为session.get will return null,而不是抛出一个异常,但它取决于你想要的行为。

加载对象,设置你的领域,并呼吁无论是

session.merge(myObject) 

是标准的方法,虽然也可以使用

session.saveOrUpdate(myObject) 

只要对象尚未分离,在你的情况下,它不会被分离。 Here is a good article解释合并和saveOrUpdate的差异。

在你的第二个例子,你正在编辑的对象的主键?这通常是不好的形式,您应该删除并插入而不是更改主键。

+0

您可能已经知道这一点,但saveOrUpdate可以处理分离的对象。唯一一次遇到麻烦的时候,是有一个现有的对象具有相同的ID连接到会话。 –

+0

'saveOrUpdate'将更新值的分贝(+1) – bluefoot

+0

@Russ Sanwald现有对象:在第二个方法whati我试图做的是,我想更新object.Now更新它,我不想取它从数据库然后更新,而不是我创建一个新的对象A,设置其主键和字段N,然后更新。我设置主键为我想用primarykey = X更新对象(假设对象与id x已经目前在数据库中,我设置fieldN,因为我想更新它。我不改变主键,但我的目的是chnage使用id = X – akshay

13

如果您需要更新大量的实体中的一次最有效的方法是使用一个查询:

Query query = session.createQuery("update EntityName set fieldP = 'newValue' " 
     + "where id IN (75, 76)"); 
query.executeUpdate(); 

这允许您更改字段值,而无需加载的实体到内存中。

这是最好的做法是使用命名查询和命名参数 - 上述实施仅仅是一个例子。这里

+0

这可以被认为是对这个问题偏离主题。 – bluefoot

+6

我不同意。首先,如果有一个,他会要求采取不同的方法。其次,从他的第二个代码片段可以清楚地看出,他想避免将实体加载到内存中。 –

0

一个更优化,可以使用动态更新设置为true的实体。这将确保只要有更新,只有被更改的字段被更新。

+0

是有必要首先从数据库中,然后获取对象update.What如果我实例化一个新的对象ID为X,然后只设置我想更新的领域?在我的方法2个未设置保存为所有其他领域nulls,我希望它应该保留旧的非空值 – akshay

2

使用JPA,你可以这样来做。

CriteriaBuilder builder = session.getCriteriaBuilder(); 
CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class); 
Root<User> root = criteria.from(User.class); 
criteria.set(root.get("fname"), user.getName()); 
criteria.set(root.get("lname"), user.getlastName()); 
criteria.where(builder.equal(root.get("id"), user.getId())); 
session.createQuery(criteria).executeUpdate();