If I include the folowing lines :
if(NachweiseForm.this.getModelObject().getKunde()!=null) {
Kunde kunde =
kundeManager.get(NachweiseForm.this.getModelObject().getKunde().getId());
NachweiseForm.this.getModelObject().setKunde(kunde);
kunde.addNachweis(NachweiseForm.this.getModelObject());
System.err.println("Kunde");
}
before the save
everything is fine
But I hoped to avoid such lines by AbstractEntityModel.
Am 05.05.2014 20:35, schrieb mscoon:
This is a hibernate issue, not a wicket issue. As I said before I am now
99% sure the problem is with the way you are using hibernate.
The bug you are getting is not caused by the line you highlighted. The
line Kunde
kunde=kundeManager.get(new Long(pars.get("kundennr").toString())); executes
a select query to the database. Hibernate will try to flush all pending
inserts and updates before issuing a select.
So what is happening is that somewhere earlier you have updated an object
(say object A) with a reference to another object (say object B) which has
not been saved. For instance you did:
B b = new B();
a.addtB(b);
When hibernate tries to update a, it will throw this exception because b
has not been saved and has no id.
What you should do is:
B b = new B();
session.save(b);
a.addB(b);
This is just an example of how hibernate works with respect to the bug you
are getting.
Now, a wild guess (I may well be wrong) is that the following line:
nachweiseform.getModelObject().getKunde().addNachweis(nachwe
iseform.getModelObject());
may be causing the problem if hibernate tries to save kunde with
nachweiseform.getModelObject()
which is a new object with a null id.
You may try to move this line to saveNachweise().
On Mon, May 5, 2014 at 2:54 PM, Yahoo <hansheinrichbr...@yahoo.de> wrote:
Am 05.05.2014 11:05, schrieb mscoon:
In a previous message you sent the following snippets:
//@XmlTransient
@ManyToOne(cascade = CascadeType.MERGE,fetch=FetchType.LAZY)
@JoinColumn(name="NachKundNr",insertable=false, updatable=false)
public Kunde getKunde(){
return this.kunde;
}
recursive Part for Kunde
@XmlTransient
@OneToMany(cascade={CascadeType.MERGE},fetch=FetchType.LAZY)
@JoinColumn(name="NachKundNr",insertable=false, updatable=false )
when I remove this I get the error :
org.hibernate.TransientObjectException: object references an unsaved
transient instance - save the transient instance before flushing:
braunimmobilien.model.Nachweise
at org.hibernate.engine.internal.ForeignKeys.
getEntityIdentifierIfNotUnsaved(ForeignKeys.java:249)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:459)
at org.hibernate.type.ManyToOneType.nullSafeSet(
ManyToOneType.java:132)
at org.hibernate.persister.collection.AbstractCollectionPersister.
writeElement(AbstractCollectionPersister.java:867)
at org.hibernate.persister.collection.AbstractCollectionPersister.
insertRows(AbstractCollectionPersister.java:1475)
at org.hibernate.action.internal.CollectionUpdateAction.execute(
CollectionUpdateAction.java:86)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(
ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(
ActionQueue.java:278)
at org.hibernate.event.internal.AbstractFlushingEventListener.
performExecutions(AbstractFlushingEventListener.java:326)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(
DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
at org.hibernate.internal.SessionImpl.managedFlush(
SessionImpl.java:402)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.
beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.
commit(AbstractTransactionImpl.java:175)
at org.springframework.orm.hibernate4.HibernateTransactionManager.
doCommit(HibernateTransactionManager.java:554)
at org.springframework.transaction.support.
AbstractPlatformTransactionManager.processCommit(
AbstractPlatformTransactionManager.java:755)
at org.springframework.transaction.support.
AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionMan
ager.java:724)
at org.springframework.transaction.interceptor.
TransactionAspectSupport.commitTransactionAfterReturnin
g(TransactionAspectSupport.java:475)
at org.springframework.transaction.interceptor.
TransactionAspectSupport.invokeWithinTransaction(
TransactionAspectSupport.java:270)
at org.springframework.transaction.interceptor.
TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.
invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.
proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.
invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy112.get(Unknown Source)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(
LazyInitProxyFactory.java:435)
at com.sun.proxy.$Proxy94.get(Unknown Source)
at braunimmobilien.webapp.nachweis.NachweisPanel.<init>(
NachweisPanel.java:100)
at braunimmobilien.webapp.nachweis.NachweisPage.<init>(
NachweisPage.java:47)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.apache.wicket.session.DefaultPageFactory.newPage(
DefaultPageFactory.java:171)
at org.apache.wicket.session.DefaultPageFactory.newPage(
DefaultPageFactory.java:99)
at org.apache.wicket.DefaultMapperContext.newPageInstance(
DefaultMapperContext.java:137)
at org.apache.wicket.core.request.handler.PageProvider.
resolvePageInstance(PageProvider.java:268)
at org.apache.wicket.core.request.handler.PageProvider.
getPageInstance(PageProvider.java:166)
at org.apache.wicket.request.handler.render.PageRenderer.
getPage(PageRenderer.java:78)
at org.apache.wicket.request.handler.render.WebPageRenderer.respond(
WebPageRenderer.java:271)
at org.apache.wicket.core.request.handler.RenderPageRequestHandler.
respond(RenderPageRequestHandler.java:175)
at org.apache.wicket.request.cycle.RequestCycle$
HandlerExecutor.respond(RequestCycle.java:862)
at org.apache.wicket.request.RequestHandlerStack.execute(
RequestHandlerStack.java:64)
at org.apache.wicket.request.cycle.RequestCycle.execute(
RequestCycle.java:261)
at org.apache.wicket.request.cycle.RequestCycle.
processRequest(RequestCycle.java:218)
at org.apache.wicket.request.cycle.RequestCycle.
processRequestAndDetach(RequestCycle.java:289)
at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(
WicketFilter.java:259)
at org.apache.wicket.protocol.http.WicketFilter.
processRequest(WicketFilter.java:201)
at org.apache.wicket.protocol.http.WicketFilter.doFilter(
WicketFilter.java:282)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.
doFilter(ServletHandler.java:1338)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.
doFilter(SiteMeshFilter.java:65)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.
doFilter(ServletHandler.java:1338)
at org.springframework.orm.hibernate4.support.
OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152)
at org.springframework.web.filter.OncePerRequestFilter.
doFilter(OncePerRequestFilter.java:107)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.
doFilter(ServletHandler.java:1338)
at braunimmobilien.webapp.MessageFilter.doFilter(
MessageFilter.java:32)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.
doFilter(ServletHandler.java:1338)
at org.springframework.web.filter.CharacterEncodingFilter.
doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.
doFilter(OncePerRequestFilter.java:107)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.
doFilter(ServletHandler.java:1338)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(
ServletHandler.java:484)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(
ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(
SecurityHandler.java:524)
at org.eclipse.jetty.server.session.SessionHandler.
doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.
doHandle(ContextHandler.java:1065)
at org.eclipse.jetty.servlet.ServletHandler.doScope(
ServletHandler.java:413)
at org.eclipse.jetty.server.session.SessionHandler.
doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.
doScope(ContextHandler.java:999)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(
ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(
ContextHandlerCollection.java:250)
at org.eclipse.jetty.server.handler.HandlerCollection.
handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(
HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:350)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(
AbstractHttpConnection.java:454)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(
AbstractHttpConnection.java:890)
at org.eclipse.jetty.server.AbstractHttpConnection$
RequestHandler.headerComplete(AbstractHttpConnection.java:944)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
at org.eclipse.jetty.http.HttpParser.parseAvailable(
HttpParser.java:230)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(
AsyncHttpConnection.java:77)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(
SelectChannelEndPoint.java:606)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(
SelectChannelEndPoint.java:46)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(
QueuedThreadPool.java:603)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(
QueuedThreadPool.java:538)
at java.lang.Thread.run(Thread.java:744)
at
final NachweiseForm nachweiseform=new NachweiseForm("form",model);
if
(!(pars.getPosition("nachweisnr")>=0&&pars.get("nachweisnr").toLong()>0))
{
if (pars.getPosition("kundennr")>=0&&pars.get("kundennr").toLong()>0)
{
here ===> Kunde kunde=kundeManager.get(new
Long(pars.get("kundennr").toString()));
System.err.println("====================== set Kunde reached");
nachweiseform.getModelObject().setKunde(kunde);
// nachweiseform.getModelObject().getKunde().addNachweis(
nachweiseform.getModelObject());
}
}
add(nachweiseform);
public List<Nachweise> getNachweise() {
return nachweise;
}
It seems like both sides of the relationship are set as insertable=false,
updatable = false. This would explain why kunde becomes null after saving,
though it contradicts your statement that everything is saved ok in the
db.
Either way the AbstractEntityModel has nothing to do with how properties
of
the model object are stored in the db, so I still believe the problem is
somewhere else in your code.
Marios
On Mon, May 5, 2014 at 11:26 AM, Yahoo <hansheinrichbr...@yahoo.de>
wrote:
First I have to tell you concerning the mapping I used the wrong word the
dependencies in the mapping are not recursive bur circular.
Am 04.05.2014 22:24, schrieb mscoon:
I'm not sure I see something wrong in your code, but then again you
have
omitted a lot of stuff which could be cruicial.
Does nachweiseform have any components that show/update kunde?
Label nachkundnr=new Label("kunde.id");
add(nachkundnr);
What exactly do you mean by saying "after save it disappears"? Has it
been
stored correctly in the database or is it wrong there too?
Everything is stored correctly in the Database only NachKundNr is NULL
Have you tried to create a minimal case where you are setting kunde to
an
object without having any wicket forms?
I have no problems with kunde in the TestCases
What is the value of kunde before saving to the db? If it is correctly
set
then you likely have a problem with your mapping. If it's not correctly
set
then something is wrong with your form.
The problem is only with new Kunde() because Kunde must be preset and
cannot be changed in the Form. Before using AbstractEntityModel I took
all
Ids of the MANYTOONE relationships in the model and loaded them from the
Database and implanted them newly in Kunde before storing. My hope was to
avoid this by using AbstractEntityModel.This works for all Dependencies
which are set in the Form
On Sun, May 4, 2014 at 1:02 PM, Yahoo <hansheinrichbr...@yahoo.de>
wrote:
I have a suspicion: I have defened all dependencies with jpa or
hibernate
annotation.
So I have also a lot of cicular dependencies, which sometimes make
problem.
I will give you 2 examples. one which is OK when I use
AbstractEntityModel
and on which makes problem, which is not set in the form through the
Model
but before.
1.
the hibernatemodel:
@IndexedEmbedded
@ManyToOne(cascade=CascadeType.MERGE,fetch = FetchType.LAZY)
@JoinColumn(name="NachAngNr",insertable=false, updatable=false)
public Angebot getAngebot(){
return this.angebot;
}
recursive part in Angebot:
@XmlTransient
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="NachAngNr",nullable=false )
public List<Nachweise> getNachweise() {
return nachweise;
}
Angebot is set by DropDownChoice in the form
private IModel<List<? extends Angebot>> makeChoicesAngebote =
new
AbstractReadOnlyModel<List<? extends Angebot>>()
{
@Override
public List<Angebot> getObject()
{ List<Angebot> angebotelist=new
ArrayList<Angebot>();
Iterator angeboteiterator=
angebotManager.getAngebote().iterator();
while(angeboteiterator.hasNext()){
Angebot angebot=(Angebot)
angeboteiterator.next();
if(angebot.getAngstatus().getId().longValue()==1)
angebotelist.add(angebot);
}
return angebotelist;
}
};
IChoiceRenderer<Angebot> angebotchoicerenderer=
new IChoiceRenderer<Angebot>() {
public Object getDisplayValue(Angebot angebot)
{
return angebot.getId();
}
public String getIdValue(Angebot angebot,int
index)
{
return angebot.getId();
}
};
final DropDownChoice<Angebot> angebote = new DropDownChoice<Angebot>("
angebot",
makeChoicesAngebote,angebotchoicerenderer);
The recursive part is treated in NachweiseManagerImpl :
public Nachweise saveNachweise(Nachweise nachweise) throws
NachweiseExistsException {
try {
if(nachweise.getId()==null){
System.err.println("xxxxxxxxxxxxxxxxxx Id=null");
if(nachweise.getMitarbeiter()!=null) {
}
======================= recursive Part for Kunde
later =======================
/* if(nachweise.getKunde()!=null) {
System.err.println("xxxxxxxxxxxxxxxxxx Kunde");
(nachweise.getKunde()).addNachweis(nachweise);
}*/
if(nachweise.getXtyp()!=null) {
}
if(nachweise.getAngebot()!=null) {
nachweise.getAngebot().addNachweis(nachweise);
System.err.println("xxxxxxxxxxxxxxxxxx Angebot");
}
======================= recursive Part for Angebot
=======================
if(nachweise.getAngebot1()!=null) {
nachweise.getAngebot1().addNachweis1(nachweise);
}
if(nachweise.getAngebot2()!=null) {
nachweise.getAngebot2().addNachweis2(nachweise);
}
if(nachweise.getObjekt()!=null) {
nachweise.getObjekt().addNachweise(nachweise);
}
if(nachweise.getPerson()!=null) {
nachweise.getPerson().addNachweis(nachweise);
}
}
return nachweiseDao.saveNachweise(nachweise);
} catch (DataIntegrityViolationException e) {
//e.printStackTrace();
log.warn(e.getMessage());
throw new NachweiseExistsException("Nachweise '" +
nachweise.getId() + "' already exists!");
} catch (JpaSystemException e) { // needed for JPA
//e.printStackTrace();
log.warn(e.getMessage());
throw new NachweiseExistsException("Nachweise '" +
nachweise.getId() + "' already exists!");
}
}
Angebot is set by the DropDownChoice Nachweise is first inserted and
can
be changed.
2.
the hibernateModel:
//@XmlTransient
@ManyToOne(cascade = CascadeType.MERGE,fetch=FetchType.LAZY)
@JoinColumn(name="NachKundNr",insertable=false, updatable=false)
public Kunde getKunde(){
return this.kunde;
}
recursive Part for Kunde
@XmlTransient
@OneToMany(cascade={CascadeType.MERGE},fetch=FetchType.LAZY)
@JoinColumn(name="NachKundNr",insertable=false, updatable=false )
public List<Nachweise> getNachweise() {
return nachweise;
}
Kunde ist set is set after before adding the form :
final NachweiseForm nachweiseform=new NachweiseForm("form",model);
if (!(pars.getPosition("nachweisnr")>=0&&pars.get("
nachweisnr").toLong()>0))
{
if (pars.getPosition("kundennr")>=0&&pars.get("kundennr").
toLong()>0)
{
Kunde kunde=kundeManager.get(new Long(pars.get("kundennr").
toString()));
System.err.println("====================== set Kunde
reached");
nachweiseform.getModelObject().setKunde(kunde);
======================= recursive Part for Kunde early set
=======================
nachweiseform.getModelObject().getKunde().addNachweis(
nachweiseform.getModelObject());
}
}
after opening the form you see the Id of Kunde
after save it disappears.
add(nachweiseform);
When I set the recursive part later same result
When I try to set the recursive part later I get the same result
Am 04.05.2014 08:55, schrieb mscoon:
Usually this is not a problem. But maybe you are doing something
different
that the "usual". I think you will need to show us your code to help
you
any further.
On Sun, May 4, 2014 at 9:12 AM, Yahoo <hansheinrichbr...@yahoo.de>
wrote:
It's the solution for all MANYTOONE-Fields defined in the Form
I have a MANYTOONE-Field which is preset and not set in the Form.
This field is not stored.
Am 02.05.2014 01:24, schrieb mscoon:
No you don't. The referenced objects will be serialized along
with
the
entity you are serializing and everything should work just fine.
On Thu, May 1, 2014 at 10:30 PM, Yahoo <hansheinrichbr...@yahoo.de>
wrote:
Ok,thank you, that's it.
My Entity has a lot of MANYTOONE relationships which are set
byDropDownChoices.
In the case of a new entity, do I have to load all these Entities
too
and
to save their ids ?
Am 01.05.2014 15:01, schrieb mscoon:
Heiner,
You didn't tell us which dependency injection framework you you
using.
If you're using Spring then simply use the @SpringBean annotation
to
get a
reference to an EntityManager or a Dao.
@SpringBean automatically works only for components so you'll also
need
to
add a call to injector to your model's constructor.
public class MyModel implements IModel {
@SpringBean
EntityManager entityManager;
public MyModel() {
Injector.get().inject(this);
}
...
}
This will take care of instantiating all @SpringBean annotated
fields
as
well are handle their serialization/deserialization.
Marios
On Thu, May 1, 2014 at 3:42 PM, Yahoo <hansheinrichbr...@yahoo.de
wrote:
I tried the AbstractEntityModel <http://
http://wicketinaction.
com/2008/09/building-a-smart-entitymodel/> from Igor Vaynberg
but I
didn't get
solved the @Dependency annotation from Vaynbergs salve.
Is there another solution for the Hibernate integration for
models.
Best regards
Heiner
------------------------------------------------------------
---------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
------------------------------------------------------------
---------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
------------------------------------------------------------
---------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org