Java 使用Hibernate问题持久化Tapestry中的数据

Java 使用Hibernate问题持久化Tapestry中的数据,java,database,hibernate,tapestry,Java,Database,Hibernate,Tapestry,我已经阅读了许多其他示例,但似乎无法使用hibernate保存数据 我这里有创建对象的代码: package com.example.leaderboardApp.pages; import com.example.leaderboardApp.utility.Competitor; import org.apache.tapestry5.annotations.RequestParameter; import org.apache.tapestry5.annotations.Property

我已经阅读了许多其他示例,但似乎无法使用hibernate保存数据

我这里有创建对象的代码:

package com.example.leaderboardApp.pages;

import com.example.leaderboardApp.utility.Competitor;
import org.apache.tapestry5.annotations.RequestParameter;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.annotations.ActivationRequestParameter;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.hibernate.Session;



public class Ws {
    @ActivationRequestParameter("hipchat_id") private int hipchat_id;
    @ActivationRequestParameter("name") private String name;
    @ActivationRequestParameter("dips") private int dips;

    @Property
    private Competitor competitor;

    @Inject
    private Session session;

    @SetupRender
    void appUpdate() {
        competitor = new Competitor(hipchat_id, name);
        competitor.addReps(dips);
        System.out.println(competitor);
    }

    @CommitAfter
    Object onSuccess() {
        session.persist(competitor);
        return hipchat_id;
    }
}
然后,我有了对象类本身:

package com.example.leaderboardApp.utility;

import java.util.ArrayList;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.apache.tapestry5.beaneditor.NonVisual;
import org.apache.tapestry5.beaneditor.Validate;

import com.example.leaderboardApp.pages.Index;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.hibernate.Session;


@Entity()
public class Competitor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @NonVisual
    public int hipchat_id;

    @Validate("required")
    private String name;

    private int score;

    private int goal = 14000;

    private int progress = score/goal;

    public Competitor(int hipchat_id, String name) {
        this.hipchat_id = hipchat_id;
        this.name = name;
    }


    public String getName() {
        return this.name;
    }

    public void addReps(int repetitions) {
        this.score += repetitions;
    }
最后是我的配置页面:

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="hibernate.connection.url">jdbc:hsqldb:./target/work/leaderboardApp;shutdown=true</property>
        <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
        <property name="hibernate.connection.username"></property>
        <property name="hibernate.connection.password"></property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <mapping package="com.example.leaderboardApp.utility.Competitor" />
    </session-factory>
</hibernate-configuration>

看起来上面的对象是正确创建的,但我在持久性方面确实很挣扎。任何帮助都将不胜感激。

好吧,很遗憾,我的帖子在这里肯定没有得到足够的关注,但我已经在这方面做了大量的研究,我想我会分享我的发现

首先,我改为使用SQL,而不是使用hibernates本机数据库。这使速度提高了10倍。我知道它可能不是所有应用程序的最佳解决方案,但对于较小或非必要的应用程序,它是最简单的

在我的Hibernate配置文件下面:

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/leaderboardApp</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <mapping class="com.example.leaderboardApp.utility.Competitor"/>
        <mapping class="com.example.leaderboardApp.utility.Record"/>
    </session-factory>
</hibernate-configuration>
在主配置下面,您必须告诉Hibernate您的类是什么。这是映射类部分。我已经看到了一百万个使用包映射等的实现。同样,对于一个简单的应用程序,这是最简单的

在Hibernate配置文件中映射类之后,请返回.java类,以Hibernate将其与MySQL表正确关联的方式对其进行构造

@Entity
@Table(name="competitors")
public class Competitor {
    @Id
    @Column(name="hipchat_id", unique=true, nullable=false)
    public int hipchat_id;

    @Column(name="name")
    @Validate("required")
    private String name;

    @Column(name="score")
    private int score;

    @Column(name="goal")
    private int goal = 14000;

    @Column(name="progress")
    private int progress = score/goal;
声明每个变量时,需要确保数据类型正确。您可以在这里看到,我(故意)错误地将progress声明为int,而它应该是double

请注意,我已将这些变量声明为列以及DB中的列名称。这是必要的,没有这一点,你会有很多头痛

最后,当您要保存数据时,我发现表单有大量stackoverflow描述,但后端启动的DB保存没有。因此,我也将该代码包括在下面:

public class Ws {
    @ActivationRequestParameter("hipchat_id") private int hipchat_id;
    @ActivationRequestParameter("name") private String name;
    @ActivationRequestParameter("dips") private int dips;

    @Property
    private Competitor competitor;

    @Inject
    private Session session;

    @SetupRender
    @CommitAfter
    void appUpdate() {
        session.saveOrUpdate(new Competitor(hipchat_id, name, dips));
        session.save(new Record(hipchat_id, dips));
    }

}
基本上,您必须使用@Inject启动会话。然后,由于这是一个处理URL参数的WS,我使用@SetupRender在页面呈现时启动该方法。很多时候,人们使用OnSuccess方法将@CommitAfter放在整个方法之后,但是对于java启动的会话,这不起作用。因此,对于这些,我将其直接放在SetupRender之后,以确保在该方法期间执行的所有会话保存/编辑/删除都在之后提交。没有这一点,您的程序将悄悄地失败。任何东西都不会跳出你的视线,你的数据也不会被保存


我很抱歉,因为我在开发方面有点新手,所以我可能没有在这里对所有内容进行最佳描述,但希望它能帮助以后的人。

好吧,不幸的是,我的帖子在这里肯定没有得到足够的关注,但我已经在这方面做了大量的研究,我想我会分享我的发现

首先,我改为使用SQL,而不是使用hibernates本机数据库。这使速度提高了10倍。我知道它可能不是所有应用程序的最佳解决方案,但对于较小或非必要的应用程序,它是最简单的

在我的Hibernate配置文件下面:

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/leaderboardApp</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <mapping class="com.example.leaderboardApp.utility.Competitor"/>
        <mapping class="com.example.leaderboardApp.utility.Record"/>
    </session-factory>
</hibernate-configuration>
在主配置下面,您必须告诉Hibernate您的类是什么。这是映射类部分。我已经看到了一百万个使用包映射等的实现。同样,对于一个简单的应用程序,这是最简单的

在Hibernate配置文件中映射类之后,请返回.java类,以Hibernate将其与MySQL表正确关联的方式对其进行构造

@Entity
@Table(name="competitors")
public class Competitor {
    @Id
    @Column(name="hipchat_id", unique=true, nullable=false)
    public int hipchat_id;

    @Column(name="name")
    @Validate("required")
    private String name;

    @Column(name="score")
    private int score;

    @Column(name="goal")
    private int goal = 14000;

    @Column(name="progress")
    private int progress = score/goal;
声明每个变量时,需要确保数据类型正确。您可以在这里看到,我(故意)错误地将progress声明为int,而它应该是double

请注意,我已将这些变量声明为列以及DB中的列名称。这是必要的,没有这一点,你会有很多头痛

最后,当您要保存数据时,我发现表单有大量stackoverflow描述,但后端启动的DB保存没有。因此,我也将该代码包括在下面:

public class Ws {
    @ActivationRequestParameter("hipchat_id") private int hipchat_id;
    @ActivationRequestParameter("name") private String name;
    @ActivationRequestParameter("dips") private int dips;

    @Property
    private Competitor competitor;

    @Inject
    private Session session;

    @SetupRender
    @CommitAfter
    void appUpdate() {
        session.saveOrUpdate(new Competitor(hipchat_id, name, dips));
        session.save(new Record(hipchat_id, dips));
    }

}
基本上,您必须使用@Inject启动会话。然后,由于这是一个处理URL参数的WS,我使用@SetupRender在页面呈现时启动该方法。很多时候,人们使用OnSuccess方法将@CommitAfter放在整个方法之后,但是对于java启动的会话,这不起作用。因此,对于这些,我将其直接放在SetupRender之后,以确保在该方法期间执行的所有会话保存/编辑/删除都在之后提交。没有这一点,您的程序将悄悄地失败。任何东西都不会跳出你的视线,你的数据也不会被保存


我很抱歉,因为我在开发方面有点新手,所以我可能没有在这里对所有内容进行最佳描述,但希望它能帮助其他人。

“在持久性方面真的很挣扎”这到底意味着什么?您希望看到什么?您希望看到什么?我的意思是,我希望在目标文件中保存数据,以便在重新启动服务器时不会丢失所有内容。这就是使用Hibernate的全部目标。我是超级新手,所以我可能会错过一个关键步骤或配置。“在持久性方面真的很挣扎”这到底意味着什么?您希望看到什么?您希望看到什么?我的意思是,我希望在目标文件中保存数据,以便在重新启动服务器时不会丢失所有内容。这就是使用Hibernate的全部目标。我是超级新手,所以我可能会错过一个关键步骤或配置。