Java 使用Hibernate问题持久化Tapestry中的数据
我已经阅读了许多其他示例,但似乎无法使用hibernate保存数据 我这里有创建对象的代码: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
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的全部目标。我是超级新手,所以我可能会错过一个关键步骤或配置。