【问题标题】:How to do mapping in Hibernate如何在 Hibernate 中进行映射
【发布时间】:2019-12-12 17:55:17
【问题描述】:

我使用的是hibernate(没有spring),但我有一个关于映射的问题。 我有 2 个实体,“用户”和“Enquête”,使用此映射代码:

入队:

@ManyToOne(fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL);
private User responsable;

在用户中:

(与 Enquête 无关,因为目前没有“映射”)

当我尝试像这样保存一个新的“Enquête”时:

private static void addEnqueteInBdd(String titre,Date dateCreation,Date dateFermeture,Boolean cloture,int idEnquete,Formulaire formulaire,User responsable,List<Collecte> collectes) {
        Transaction transaction = null;
        Enquete en = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            transaction = session.beginTransaction();           
            en = new Enquete( titre, dateCreation, dateFermeture, cloture, collectes, formulaire,responsable );
            session.save(en);
            transaction.commit();   
        } catch (Exception e) {
            e.printStackTrace();
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

我有这个错误:

错误:HHH000346:托管刷新期间出错[行已被另一个事务更新或删除(或未保存的值映射不正确):[Model.User#1]]

PS:这是我在代码中使用休眠的第一个操作,所以我认为这与另一个事务无关。

【问题讨论】:

  • 嗨。我认为还必须保存用户 ID。尝试在用户字段中添加注释@joinColumn

标签: java hibernate mapping


【解决方案1】:

您作为参数传递的User 很可能已在另一个事务中检索到并已分离。

尝试先合并该实体,然后执行保存:

        try {
            User responsableMerged = session.merge(responsable);
            transaction = session.beginTransaction();           
            en = new Enquete( titre, dateCreation, dateFermeture, 
                 cloture, collectes, formulaire,responsableMerged );
            session.save(en);
            transaction.commit();   
        }

也不要使用 Hibernate 特定的级联。在 MAnyToOne 上使用标准 JPA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多