【问题标题】:Inserting values to database using JPA使用 JPA 将值插入数据库
【发布时间】:2016-04-11 22:04:37
【问题描述】:

我正在尝试通过 JPA hibernate 从 ms sql 表中读取列的值,并在对每个值进行一些操作后将它们存储到同一表的另一列中。下面的代码从表 Kennzahl 中读取列 kNFormelZPS,然后在表的请求处插入一条 id 为 0 的新记录,并将单词 new 写入该单元格!然后它会抛出一个异常,说主键不能重复。我猜它会尝试生成 ID 为 0 的新记录。

public class ManageKennzahl {

private static EntityManagerFactory factory;
EntityManager em = null;
private static List<String> kNFormelZPs = new ArrayList<>();


/**
 * @param args
 */
public static void main(String[] args) {
    try {
        factory = Persistence.createEntityManagerFactory("migration");

    } catch (Throwable ex) {
        System.err.println("Failed to create sessionFactory object." + ex);
        throw new ExceptionInInitializerError(ex);
    }
    ManageKennzahl mk = new ManageKennzahl();

    mk.getKNFormelZPsFromKennzahl();
    mk.getKNFormelNPsFromKennzahl();
    mk.convert();
}

/**
 * 
 */
private List<String> getKNFormelZPsFromKennzahl() {
    em = factory.createEntityManager();
    try {

        List<Kennzahl> kNFormelZPSs = em.createQuery("Select i From Kennzahl i ", Kennzahl.class).getResultList();
        for (Kennzahl kNFormelZPS : kNFormelZPSs) {
            String FormelZPs = kNFormelZPS.getFormelZPseudo();
            aquaQidbKNFormelZPs.add(FormelZPs);
        }

    } catch (HibernateException e) {
        e.printStackTrace();
    } finally {
        em.close();
    }
    return kNFormelZPs;
}



private void convert() {
    Kennzahl kn = new Kennzahl();
    em = factory.createEntityManager();
    for (String fomelZPs : kNFormelZPs) {
        em.getTransaction().begin();    
        kn.setFormelZGL1(fomelZPs + "new");
        em.persist(kn);
        em.getTransaction().commit();
    }
}
}

【问题讨论】:

  • 为什么 JPA 应用程序会使用“HibernateException”?!没有实体,怎么会有人对此发表评论?为什么不通过查看LOG来调试呢?
  • 你似乎总是坚持同一个Kennzahl实例。

标签: java sql-server hibernate jpa


【解决方案1】:

主要问题是没有使用合并以避免创建新实体。

private void convert() {
Kennzahl kn = new Kennzahl();
em = factory.createEntityManager();
for (Kennzahl qidbKennzahl : aqidbKennzahlen) {
  qidbKennzahl.setFormelZGL1(qidbKennzahl .getFormelZPseudo() + " test");
  em.merge(aquaQidbKennzahl);
  }
em.getTransaction().commit();
}

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2011-05-29
    • 2021-02-09
    • 2015-02-08
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多