Java 使用JPA向数据库插入值

Java 使用JPA向数据库插入值,java,sql-server,hibernate,jpa,Java,Sql Server,Hibernate,Jpa,我试图通过JPA hibernate从ms sql表中读取一列的值,并在对每个值进行一些操作后将它们存储到同一表的另一列中。下面的代码从Kennzahl表中读取列kNFormelZPS,然后在id为0的表中插入一条新记录,并仅将单词new写入该单元格!然后它抛出一个异常,表示主键不能复制。我猜它试图生成Id为0的新记录 public class ManageKennzahl { private static EntityManagerFactory factory; EntityManager

我试图通过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();
    }
}
}

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

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();
}

为什么JPA应用程序要玩HibernateException?!没有实体,任何人怎么能对此发表评论?为什么不通过查看日志来调试它呢?您似乎总是坚持使用同一个Kennzahl实例。