所以,我试图将来自 swing Action 监听器的数据放入 SQL 数据库中。
这是我的操作监听器代码的一部分,触发将数据放入数据库
poruka = "U suficitu ste ~ " + brojKalorija
+ " kalorija.";
JOptionPane.showMessageDialog(null, poruka);
Podaci noviPodaci = new Podaci(brojKalorija, danInt,
mjesecInt, godinaInt, proteiniInt,
ugljikohidratiInt, mastiInt, godineInt,
masaInt, aktivnostInt, hrInt);
DatabaseUtils.spremiPodatke(noviPodaci);
}
这是 DatabaseUtils 的重要组成部分:
public class DatabaseUtils {
public static void spremiPodatke(Podaci podaci) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistenceUnit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(podaci);
em.getTransaction().commit();
}
这是podaci.java,它获取所有数据:
@Entity
@Table(name = "podaci.podaci_izracuna")
public class Podaci {
@Id
@Column(name = "brojKalorija_ID")
@GeneratedValue
private double brojKalorijaId;
@Column(name = "dan")
private int dan;
.
.
.
public Podaci(double brojKalorijaId, int dan, int mjesec, int godina, int proteini,
int ugljikohidrati, int masti, int godine, int masa, int aktivnost, int hr) {
this.brojKalorijaId = brojKalorijaId;
this.dan = dan;
this.mjesec = mjesec;
this.godina = godina;
this.proteini = proteini;
this.ugljikohidrati = ugljikohidrati;
this.masti = masti;
this.godine = godine;
this.masa = masa;
this.aktivnost = aktivnost;
this.hr = hr;
}
public double getBrojKalorijaId() {
return brojKalorijaId;
}
public int getDan() {
return dan;
}
.
.
(other getters)
数据库看起来像这样:
create schema podaci;
create table podaci.podaci_izracuna(
brojKalorija_ID decimal (7,2) generated always as identity,
dan int not null,
mjesec int not null,
godina int not null,
proteini int not null,
ugljikohidrati int not null,
masti int not null,
godine int,
masa int,
aktivnost int,
heartRate int,
primary key (brojKalorija_ID)
);
坚持:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="HibernatePersistenceUnit" transaction-type="RESOURCE_LOCAL">
<class>podaci.Podaci</class>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
<property name="hibernate.connection.url" value="jdbc:h2:~/potrosnjaKalorija"/>
<property name="hibernate.connection.username" value="seminar"/>
<property name="hibernate.connection.password" value="seminar"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
抱歉有很多代码,当我使用操作监听器运行该文件时,我收到以下消息: 线程“AWT-EventQueue-0”中的异常 javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给持久化的分离实体:podaci.Podaci 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
等等...
我没有数据库方面的经验,我认为持久化是问题所在,希望ypu可以提供帮助。
最佳答案
您已将数据库配置为生成 @Id 属性 (brojKalorijaId),但您正在构造函数中设置它。
将构造函数更改为不设置 brojKalorijadId 属性。当实体被持久化时,数据库将为@Id创建一个唯一的值。
或
向实体添加一个新属性,该属性将保存数据库生成的@Id。
关于java - 线程 "AWT-EventQueue-0"中出现异常;传递给持久化的分离实体(在 Java 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332958/