java 使用现有ID休眠保存实体

5lhxktic  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(119)

我正在使用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();
        }
j8ag8udp

j8ag8udp1#

正如我理解的问题,你想持久化数据库中的实体,而不让Hibernate为你生成一个标识符。要完成它,你可以使用以下代码:
如果具有ID的实体已存在于数据库中,并且应该更新-请用途:

session.merge(myEntity); // myEntity contains the id

如果它是一个新的实体,应该插入-请用途:

UUUID id = UUID.randomUUID(); // new id will be generated
myEntity.setId(id);
session.persist(myEntity);
s71maibg

s71maibg2#

当保存实体时使用更新查询而不是插入查询时,hibernate假设该实体已经持久化在DB中。要保存一个新实体,并将预先生成的UUID作为主键,您可以使用sameOrUpdate()方法而不是保存().这个方法将检查实体是否已经在数据库中持久化,如果不可用,则执行插入请求。您可以使用持久化()方法也代替了保存(),它类似于saveOrUpdate(),但如果实体已经持久化,它将抛出异常。

相关问题