java-为什么在没有LockTimeoutException的情况下不能合并()域对象?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-为什么在没有LockTimeoutException的情况下不能合并()域对象?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2397字,纯文字阅读大概需要4分钟。
内容图文
![java-为什么在没有LockTimeoutException的情况下不能合并()域对象?](/upload/InfoBanner/zyjiaocheng/681/f6b94173f49044baa6fd6bc9febbb0cf.jpg)
我正在使用休眠作为我的持久层创建一个CRUD API.
该API接受JSON并将其序列化为POJO.然后,管理层将POJO转换为新的Hibernate Domain对象.
对于创建和更新都运行完全相同的代码-唯一的区别是对于更新,我还设置了休眠对象的ID字段.
创建工作正常,但Update失败,出现org.hibernate.exception.LockTimeoutException.经过数小时的窥探,我将挥舞白旗,希望有人可以解释我是白痴的所有原因.
ClientManager代码
public class ClientManager {
private static final ClientDAO clientDAO = new ClientDAO();
...
public Client updateClient(ClientVO inputVO) {
// Generate a Client from the input
Client client = ClientManager.generateClient(inputVO);
client.setClientKey(Integer.parseInt(inputVO.getPersonalId()));
client.setUpdateDate(new Date());
client.setUpdateTimestamp(new Date());
// Update the client
clientDAO.update(client);
}
...
public static Client generateClient(ClientVO clientVO) {
Client client = new Client();
client.setFirstName(clientVO.getFirstName());
client.setMiddleName(clientVO.getMiddleName());
client.setLastName(clientVO.getLastName());
return client;
}
}
BaseDAO代码(ClientDAO扩展了BaseDAO)
public class BaseDAO {
public Boolean save(Object object) {
Session session = getSession();
Transaction tx = session.beginTransaction();
session.save(object);
tx.commit();
session.close();
return Boolean.TRUE;
}
public Boolean update(Object object) {
Session session = getSession();
Transaction tx = session.beginTransaction();
session.merge(object);
tx.commit();
session.close();
return Boolean.TRUE;
}
public Session getSession()
{
return HibernateSessionFactory.getSession();
}
}
入口点代码
@PUT
@Path("clients/{personalId}")
@Produces({MediaType.APPLICATION_JSON})
public String updateClient(@PathParam("personalId") String personalId, String data) throws JsonParseException, JsonMappingException, IOException {
ClientVO inputVO = om.readValue(data, ClientVO.class);
inputVO.setPersonalId(personalId);
ClientVO outputVO = clientManager.updateClient(inputVO);
return om.writeValueAsString(outputVO);
}
请注意,clientKey是主键.
超时发生在BaseDAO的update()方法中的.commit()点.
如果有用,我很乐意提供更多代码(例如ClientVO).
解决方法:
发生这种情况的唯一方法是,您有两个试图修改同一实体的数据库连接.
如果单用户发生这种情况,那是因为您没有为整个请求使用相同的会话,而是创建了多个会话.我想说的是,您在某个外部级别上打开了一个Hibernate Session和一个事务,当调用update方法时,您打开了另一个Session和一个新的事务,该事务与可能已经获得同一实体锁的外部事务冲突(因为您加载了实体并进行了更改).
内容总结
以上是互联网集市为您收集整理的java-为什么在没有LockTimeoutException的情况下不能合并()域对象?全部内容,希望文章能够帮你解决java-为什么在没有LockTimeoutException的情况下不能合并()域对象?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。