我有两个相同类型的对象。一个来自数据库,另一个来自其他上下文。现在我想用第二个对象的值更新第一个值。我使用hibernate作为ORM。以下方案的最佳做法是什么
Class A{
int id;
String name;
}
A obj1= session.get(A.class, 1);
A obj2 = differnetContext();
第一个选项:
obj1.setName(obj2.getName());
session.update(obj1)
第二个选项:
obj2.setId(obj1.getId());
session.update(obj2)
存在一些函数leftmerge(obj1,obj2).exclude("id")
,它返回一个类型A的对象,其中name = world和id = 1,我可以传递给更新过程?
答案 0 :(得分:1)
您可以使用@Transactional将事务范围设置为服务级别方法,然后更新从数据库获取的“实时”实体。
例如:
@Transactional
public void editUser(int userId, User editUser) {
User liveUser = getUserDAO().findByPrimaryKey(userId);
liveUser.setNameFirst(editUser.getNameFirst());
liveUser.setNameLast(editUser.getNameLast());
liveUser.setEmail(editUser.getEmail());
}
如果您希望更新关联实体,则可以使用级联规则。假设此类中的用户具有与地址的OnetoOne关联。如果您已正确设置CascadeType,则可以使用相同的方法。
扩展示例:
@Entity
@Table(name="user")
public class User implements Serializable {
// user properties
@OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
public Address getAddress() {
return this.address;
}
}
服务水平方法......
@Transactional
public void editUser(int userId, User editUser) {
User liveUser = getUserDAO().findByPrimaryKey(userId);
liveUser.setNameFirst(editUser.getNameFirst());
liveUser.setNameLast(editUser.getNameLast());
liveUser.setEmail(editUser.getEmail());
liveUser.setAddress(editUser.getAddress());
}