[hibernate-dev] On @OneToOne(optional=true) and @PrimaryKeyJoinColumn
Emmanuel Bernard
emmanuel at hibernate.org
Thu Aug 25 03:46:27 EDT 2011
>>
>> Maybe you're right but I don't have the same rightness feeling.
>>
>> Anyways, we can't rewrite history and we can differentiate not set
>> from set to a value in Java's annotations. Besides, I suspect (has to
>> be verified) that normal forms don't like null values even for foreign
>> keys. This approach could be considered better though the proper
>> approach would be to use a join table with unique constraints.
>
> By "normal form" do you mean @OneToOne(optional=true) without a @PrimaryKeyJoinColumn or derived ID? If so, this case works fine; the foreign key column is nullable and the foreign key constraint is exported.
No, I mean http://en.wikipedia.org/wiki/Normal_form
>
>>
>>> Implicitly applying @NotFound(IGNORE) would break the default
>>> mappings for unidirectional and bidirectional one-to-one
>>> relationships documented in the spec.
>>
>> Can you expand here. I don't follow you.
>>
>
> In 2.10.1 Bidirectional OneToOne Relationships:
>
> The following mapping defaults apply:
> Entity A is mapped to a table named A.
> Entity B is mapped to a table named B.
> Table A contains a foreign key to table B. The foreign key column name is formed as the con-
> catenation of the following: the name of the relationship property or field of entity A; "_"; the
> name of the primary key column in table B. The foreign key column has the same type as the
> primary key of table B and there is a unique key constraint on it.
>
> In 2.10.3.1 Unidirectional OneToOne Relationships:
>
> The following mapping defaults apply:
> Entity A is mapped to a table named A.
> Entity B is mapped to a table named B.
> Table A contains a foreign key to table B. The foreign key column name is formed as the con-
> catenation of the following: the name of the relationship property or field of entity A; "_"; the
> name of the primary key column in table B. The foreign key column has the same type as the
> primary key of table B and there is a unique key constraint on it.
These are for the default case which we are not in as @PrimaryKeyJoinColumn is used. But I see your point. Note that the spec seems inconsistent if we want to both support optional=true and some foreign key constraint generation. We have to chose what's best of a user rather than rely on some elements of the spec.
I have emailed Linda to see what she thinks.
More information about the hibernate-dev
mailing list