1

所以,我试图将我的数据从摇摆动作监听器中放入 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 at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)

等等...

我没有数据库经验,我认为持久性是出了问题的地方,希望ypu能提供帮助。

4

1 回答 1

1

您已将数据库配置为生成 @Id 属性 (brojKalorijaId),但您是在构造函数中设置它。

将您的构造函数更改为设置 brojKalorijadId 属性。当实体被持久化时,数据库将为@Id 创建一个唯一值。

或者

向将保存数据库生成的@Id 的实体添加一个新属性。

于 2013-06-27T01:32:38.317 回答