[hibernate-issues] [Hibernate-JIRA] Created: (HHH-6403) OneToOne not optional dependent entity wrong persist order
Diego Salvi (JIRA)
noreply at atlassian.com
Wed Jul 6 13:13:54 EDT 2011
OneToOne not optional dependent entity wrong persist order
----------------------------------------------------------
Key: HHH-6403
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6403
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.6.5
Environment: Tested with hibernate-core 3.6.3.Final and 3.6.5.Final, database MySQL 5.1 with InnoDB (for foreign key costraints)
Reporter: Diego Salvi
Attachments: hib_1to1_dependent_optional_false.tar.gz
There's a problem with dependent entity persist order in a one to one relationship.
Given 2 entity ParentEntity and DependentEntity in a relationship one to one and with the second one completely dependent from first (DependentEntity PK is ParentEntity PK) I can't set optional=false one ParentEntity relationship side.
If optional=false is set on ParentEntity side DepententEntity will be persisted first but it can't because his PK is a FK to ParentEntity and it results in a constraint violation.
I've tried to check why this happen and I think that the problem resides in a wrong assumption in:
{code:title=OneToOneSecondPass.doSecondPass(Map persistentClasses)[lines 105:110]|borderStyle=solid}
if ( !optional ) value.setConstrained( true );
value.setForeignKeyType(
value.isConstrained() ?
ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT :
ForeignKeyDirection.FOREIGN_KEY_TO_PARENT
);
{code}
This assumes that if relation isn't optional then foreign key goes from parent to child (ie.: parent has a field that point to a child field) that is at least a over-simplification. From this wrong direction come a wrong persisting order.
Please be aware that a OneToOne bidirectional non optional relationship is't a silly and insane mapping and can be useful in many environment. It could be mapped as opional=true but then we have fetch problem because FetchType.LAZY can't be fulfilled.
I've added a simple test case with 2 entity. It uses annotations and entity-manager (but the real problem is on core).
Just change persistence.xml to match your db user and password and set to an empty schema (it is already set as create-drop). Failing test is: hib.test.PersistTest.persist()
I'm listing most important entity mappings for quick reference (in attached test case are obviously complete), as you can see the are really simple (I've tried to use default as much as I could):
{code:title=ParentEntity|borderStyle=solid}
[...]
@OneToOne( optional = false, cascade = CascadeType.PERSIST, mappedBy = "parentEntity" )
public DependentEntity getDependentEntity()
{
return dependentEntity;
}
[...]
{code}
{code:title=ParentEntity|borderStyle=solid}
[...]
@Id
@GeneratedValue( generator="foreign" )
@GenericGenerator( name="foreign", strategy = "foreign",
parameters = @Parameter( name="property", value="parentEntity" ) )
public Integer getId()
{
return id;
}
[...]
@OneToOne( optional = false )
@PrimaryKeyJoinColumn
public ParentEntity getParentEntity()
{
return parentEntity;
}
[...]
{code}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list