Hibernate ist keine Aktualisierung der Datensatz - Wicket
Ich arbeite gerade an einer Webanwendung mit Wicket, Spring und Hibernate und ich habe ein problem mit der Aktualisierung von Datensätzen. Ich habe überprüft, dass die saveOrUpdate-Methode aufgerufen, und die Daten in das domain-Objekt geändert hat. Die SQL-Ausgabe enthält jedoch nicht die Anzeige, dass alle änderungen an der Datenbank vorgenommen wurde (UPDATE-in B.) und der betroffene Datensatz nicht aktualisiert wurde.
Ich würde denke es macht mehr Sinn, die Verwendung von update (), aber ich saveOrUpdate() gelingt, neue Datensätze zu erstellen, aber es nicht zu aktualisieren. Ich habe überprüft, dass diese Methode aufgerufen WIRD, und die UserVO übergeben wird, enthält die aktualisierten Felder. Hier ist die DAO-Methode:
public class SkuldwebDAOImpl extends HibernateDaoSupport implements SkuldwebDAO {
public void updateUser(UserVO userVO) {
getSession().saveOrUpdate(userVO);
}
}
Hier ist meine property-Datei:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/skuldweb_dev;AUTO=MULTI;CURSOR=READONLY
jdbc.username=
jdbc.password=
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.use_outer_join=true
hibernate.cache.use_query_cache=true
hibernate.cache.use_second_level_cache=true
hibernate.cache.provider=org.hibernate.cache.HashtableCacheProvider
hibernate.schemaUpdate=true
Hier ist die sessionFactory bean in applicationContext.xml:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="use_outer_join">${hibernate.use_outer_join}</prop>
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider}</prop>
<prop key="hibernate.connection.pool_size">10</prop>
<prop key="hibernate.connection.autocommit">true</prop>
<prop key="hibernate.jdbc.batch_size">1000</prop>
<prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.upbeat.app.skuldweb.domain.UserVO</value>
<value>com.upbeat.app.skuldweb.domain.UserLevelVO</value>
</list>
</property>
<property name="schemaUpdate" value="${hibernate.schemaUpdate}"/>
</bean>
Hoffentlich einer von Euch kann mir helfen.
Aktualisiert Hier einige info aus dem log (onSubmit() setzt diese Einträge in der log -- der Letzte Eintrag sein sollten, wenn die Anfrage wird umgeleitet zu einer anderen Seite (nach der Aufzeichnung sollte die aktualisiert wurden).
[DEBUG] 2010-07-23 00:29:26,302 :org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:239): Verwendung von SessionFactory 'sessionFactory' für OpenSessionInViewFilter [DEBUG] 2010-07-23 00:29:26,302 :org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:214): Rückkehr zwischengespeicherte Instanz der singleton-bean 'sessionFactory' [DEBUG] 2010-07-23 00:29:26,302 :org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:181): das Öffnen einzelner Hibernate-Session in OpenSessionInViewFilter [DEBUG] 2010-07-23 00:29:26,302 :org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:318): Eröffnung Hibernate-Session [DEBUG] 2010-07-23 00:29:26,303 :org.hibernate.impl.SessionImpl.(SessionImpl.java:247): eröffnet die Sitzung am timestamp: 5242215490777088 [TRACE] 2010-07-23 00:29:26,303 :org.hibernate.impl.SessionImpl.setFlushMode(SessionImpl.java:1316): Einstellung flush-Modus: NIE [DEBUG] 2010-07-23 00:29:26,305 :org.apache.wicket.Sitzung.getPage(Session.java:700): Erste Seite [Pfad = 4:userprofile_form, versionNumber = 0] [DEBUG] 2010-07-23 00:29:26,306 :org.apache.wicket.markup.html.form.persistence.CookieValuePersister.getCookie(CookieValuePersister.java:210): kann Nicht finden, Cookie mit name=userprofile_form.E-Mail und Anfrage-URI=/fröhlich-app-skuld-web/ [TRACE] 2010-07-23 00:29:26,308 :org.hibernate.Motor.IdentifierValue.isUnsaved(IdentifierValue.java:127): nicht gespeicherte id-Wert: 0 [TRACE] 2010-07-23 00:29:26,308 :org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:546): detached Instanz: com.optimistisch.app.skuldweb.domain.UserVO [TRACE] 2010-07-23 00:29:26,308 :org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:228): aktualisieren detached Instanz [TRACE] 2010-07-23 00:29:26,308 :org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:295): Update [Kom.optimistisch.app.skuldweb.domain.UserVO#1] [TRACE] 2010-07-23 00:29:26,310 :org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:346): Update [Kom.optimistisch.app.skuldweb.domain.UserVO#1] [TRACE] 2010-07-23 00:29:26,311 :org.hibernate.Motor.Cascade.cascade(Kaskade.java:138): - Verarbeitung von cascade ACTION_SAVE_UPDATE für: Kom.optimistisch.app.skuldweb.domain.UserVO [TRACE] 2010-07-23 00:29:26,312 :org.hibernate.Motor.CascadingAction$5.cascade(CascadingAction.java:239): cascading zu saveOrUpdate: com.optimistisch.app.skuldweb.domain.UserLevelVO [TRACE] 2010-07-23 00:29:26,312 :org.hibernate.Motor.IdentifierValue.isUnsaved(IdentifierValue.java:127): nicht gespeicherte id-Wert: 0 [TRACE] 2010-07-23 00:29:26,312 :org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:546): detached Instanz: com.optimistisch.app.skuldweb.domain.UserLevelVO [TRACE] 2010-07-23 00:29:26,312 :org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:228): aktualisieren detached Instanz [TRACE] 2010-07-23 00:29:26,313 :org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:295): Update [Kom.optimistisch.app.skuldweb.domain.UserLevelVO#1] [TRACE] 2010-07-23 00:29:26,313 :org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:346): Update [Kom.optimistisch.app.skuldweb.domain.UserLevelVO#1] [TRACE] 2010-07-23 00:29:26,313 :org.hibernate.Motor.Cascade.cascade(Kaskade.java:173): done Verarbeitung cascade ACTION_SAVE_UPDATE für: Kom.optimistisch.app.skuldweb.domain.UserVO [DEBUG] 2010-07-23 00:29:26,314 :org.apache.wicket.RequestCycle.setRequestTarget(RequestCycle.java:644): ersetzen Anfrage Ziel org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget@676067951[Seite Klasse = com.optimistisch.app.skuldweb.web.Benutzer.UserProfilePage, id = 4, version = 0]->userprofile_form->Schnittstelle org.apache.wicket.markup.html-Code.form.IFormSubmitListener.IFormSubmitListener (request Parameter: [RequestParameters componentPath=4:userprofile_form pageMapName=null versionNumber=0 interfaceName=IFormSubmitListener componentId=null behaviorId=null urlDepth=-1 Parameter={[email protected],userprofile__form2_hf_0=} onlyProcessIfPathActive=false]) mit [BookmarkablePageRequestTarget@1030849724 pageClass=com.optimistisch.app.skuldweb.web.Benutzer.UserProfilePage]
Update 2
Hier ist die UserVO ohne Getter/setter
@Entity @Table(name = "USERS") @NamedQueries({ @NamedQuery(name = "user.getById", query = "from UserVO item where item.id = :id"), @NamedQuery(name = "user.getAllUsers", query = "from UserVO item order by item.registerDate desc"), @NamedQuery(name = "user.countAll", query = "select count(item) from UserVO item"), @NamedQuery(name = "user.getByUsername", query = "from UserVO item where item.username = :username"), @NamedQuery(name = "user.authenticate", query = "from UserVO item where item.username = :username AND item.passwordHash = :passwordHash") }) public class UserVO extends BaseVO {
@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "ID") protected long id; @OneToOne(cascade = CascadeType.ALL) protected UserLevelVO userLevelVO; @Basic @Column(name = "USERNAME") protected String username; @Basic @Column(name = "PASSWORD_HASH") protected String passwordHash; @Basic @Column(name = "EMAIL") protected String email; @Temporal(TemporalType.TIMESTAMP) @Column(name = "REGISTER_DATE") protected Date registerDate; @Temporal(TemporalType.TIMESTAMP) @Column(name = "LAST_LOGIN_DATE") protected Date lastLoginDate;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hibernate oft updates verzögert, bis die Sitzung geleert wird. Um zu testen, ob dies das Problem in Ihrem Fall, legen Sie eine
getSession().flush()
nach Ihrem update-Anweisung.Wie verwalten Sie Transaktionen? Die Spülung wird automatisch auftreten, wenn die Sitzung begangen, aber wenn Sie haben eine fehlerhafte Transaktion Konfiguration, die Sie bis Ende Mai Begehen die JDBC-Verbindung, aber nicht verpflichtet, die Transaktion gebunden, für die Hibernate-session.
Edit: Basierend auf Ihrem update, sehe ich, dass FlushMode ist NIE auf einer Zeile:
Ich vermute, das ist das problem. Es bewirkt, dass die session nie zu Spülen automatisch - in der Regel, was Sie tun möchten, die in einem nur-lese-Transaktion, nicht, wenn Sie die Daten ändern. Es scheint, wie Sie ausgeführt werden, ohne Transaktionen (autocommit auf true gesetzt - was nicht zu empfehlen übrigens). Die Javadoc für OpenSessionInViewFilter bietet einige Anhaltspunkte:
In anderen Worten, haben Sie zwei Möglichkeiten: entweder
flushMode
auf Ihre OpenSessionInViewFilter auf AUTO, oder, schalten Sie autocommit, und konfigurieren Sie eine Transaktion-manager wie HibernateTransactionManager.Da Sie Sie mit Spring, ich würde empfehlen, dass Sie die Feder PlatformTransactionManager zu verwalten, Ihre Transaktionen. Als Teil der Transaktion-management-Feder-automatische Spülung der Sitzung. Dies bedeutet, dass Sie nicht haben, um sorgen über jeden dieser Aspekte in Ihrem code.
Frühjahr eine OpenSessionInViewFilter, die Haken bis zu der Transaktions-manager zu starten/flush-Sitzungen, und Sie können Anmerkungen in Ihren Methoden mit Spring ' s @Transactional, um anzuzeigen, dass Sie möchten, dass ein 'write' - Transaktion für eine bestimmte Methode. Dies sollte aktualisieren Sie Ihre Aufzeichnungen.