我正在使用Servlet和Hibernate创建CRUD应用程序。
当我尝试使用save()保存一个新实体时,Hibernate会执行SQL Update查询而不是Insert。该实体已经包含了生成的ID(UUID),据我所知,它会在数据库中搜索这个实体(h2 in-memory),但没有找到它。如果ID已经生成,如何正确地将实体保存在数据库中。
@Entity
@Table(name = "MATCH")
public class Match implements Serializable {
@Id
@Column(name = "MATCH_ID")
private UUID id;
@ManyToOne
private Player playerOne;
@ManyToOne
private Player playerTwo;
@ManyToOne
private Player winner;
@Transient
private int[] score = new int[2];
public Match() {
}
//getters and setters
}
public void executePost(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {
Transaction transaction = null;
try (Session session = DBHandler.getSessionFactory().openSession()) {
transaction = session.beginTransaction();
UUID MatchUuid = UUID.fromString(servletRequest.getParameter("match-uuid"));
currentMatchService = CurrentMatchService.getInstance(); //service stores current matches in the app's memory
currentMatch = currentMatchService.getMatch(MatchUuid);
currentMatch.setWinner(currentMatch.getPlayerOne()); //player One set like winner just for test
session.save(currentMatch);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
2条答案
按热度按时间j8ag8udp1#
正如我理解的问题,你想持久化数据库中的实体,而不让Hibernate为你生成一个标识符。要完成它,你可以使用以下代码:
如果具有ID的实体已存在于数据库中,并且应该更新-请用途:
如果它是一个新的实体,应该插入-请用途:
s71maibg2#
当保存实体时使用更新查询而不是插入查询时,hibernate假设该实体已经持久化在DB中。要保存一个新实体,并将预先生成的UUID作为主键,您可以使用sameOrUpdate()方法而不是保存().这个方法将检查实体是否已经在数据库中持久化,如果不可用,则执行插入请求。您可以使用持久化()方法也代替了保存(),它类似于saveOrUpdate(),但如果实体已经持久化,它将抛出异常。