[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-6708) Loading parent/child entities with foreign key in child table being its primary key results in StackOverflowError

Florian Rampp (JIRA) noreply at atlassian.com
Wed Oct 5 09:56:28 EDT 2011


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-6708?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=43959#comment-43959 ] 

Florian Rampp commented on HHH-6708:
------------------------------------

After some more testing, I realized that the problem is more complex.


1. When calling {{session.save()}}, cascading using the annotation {{j.p.CascadeType.PERSIST}} has no effect. It only does, if {{session.persist()}} is used. On the other hand, if you use {{j.p.CascadeType.ALL}}, cascading also works with the {{session.save()}} method, since {{ALL}} implicitly adds {{o.h.a.CascadeType.SAVE_UPDATE}}, whereas {{j.p.CascadeType.PERSIST}} does not. The JavaDoc of {{ALL}} says: 
{quote}The value cascade=ALL is equivalent to cascade=\{PERSIST, MERGE, REMOVE, REFRESH, DETACH\}{quote}
I cannot assess, if this is an error. At least, it is behavior that is non-intuitive. ({{j.p.}} == {{java.persistence.}}, {{o.h.a.}} == {{org.hibernate.annotations}})

2. If I change the mapping of the {{Child}} to its {{Parent}} from
{code:java}
@Id
@OneToOne(optional = false)
private Parent parent;
{code}
to
{code:java}
@Id
private Long parentId;

@MapsId
@OneToOne(optional = false)
private StrongEntity parent;
{code}
the StackOverflowError does not occur any more. While the second one is the JPA way, http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#d0e5617 says, that Hibernate is supposed to support my initial mapping as well.


So the total solution for this is the use {{session.persist()}} instead of {{session.save()}} and the use {{@MapsId}} instead of annotating a {{@OneToOne}} relationship directly with {{@Id}}.

> Loading parent/child entities with foreign key in child table being its primary key results in StackOverflowError
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: HHH-6708
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6708
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.6.6
>         Environment: HSQL 1.8.0.10 (also reproducible with Oracle 11g, with Oracle JDBC 11.2.0.1.0
>            Reporter: Florian Rampp
>              Labels: hibernate, jpa2
>         Attachments: bugreports-hibernate-cascadeAll-1.0-SNAPSHOT-src.zip
>
>
> Consider the following parent/child relationship mapping:
> {code:java}
> @Entity
> public class Parent {
> 	@Id
> 	Long id;
> //	@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH,
> //			CascadeType.DETACH }, orphanRemoval = true, mappedBy = "parent")
> 	@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent")
> 	Child child;
> 	void setChild(Child child) {
> 		this.child = child;
> 		child.setParent(this);
> 	}
> }
> @Entity
> public class Child implements Serializable {
> 	@Id
> 	@OneToOne(optional = false)
> 	private Parent parent;
> 	public void setParent(Parent parent) {
> 		this.parent = parent;
> 	}
> }
> {code}
> When storing a parent with a child and loading it again, the load results in a StackOverflowError. When I replace the cascade type {{ALL}} with a list of all cascade types {{\{CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH\}}}, the error does not occur any more.
> I attached a test case.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list