因此,我正在尝试将来自挥杆动作侦听器的数据放入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。