See below...
On Sat, Aug 15, 2015 at 7:25 AM, Steve Ebersole <steve(a)hibernate.org> wrote:
I think I may have goofed when I implemented some of the
ImplicitNamingStrategy rules in 5.0.
During that transition, I wrote a bunch of unit test in 4.3 to serve as a
baseline to make sure I got the logic/rules right as I developed 5.0. But
I think I may have set up those initial 4.3 tests improperly.
Specifically, there are a few meant to test Hibernate's legacy naming
behavior, aka its non-JPA-compliant naming.
I think I got confused by the whole concept of NamingStrategy and
NamingStrategyDelegate and NamingStrategyDelegator that had gotten added to
4.3.
So on 4.3, what is the proper way to specify Hibernate should use
JPA-compliant implicit naming? What is the proper way to specify that it
should use its legacy naming?
This is well-documented at:
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#configu...
There are also some properties that are available for use with Entity
Manager (only documented in
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#configu...
):
- hibernate.ejb.naming_strategy
-hibernate.ejb.naming_strategy_delegator
The issue came to light via HHH-9908. Consider a mapping like:
@Entity
@Table(name = "ptx")
public class Ptx {
@Id
private Integer id;
@ManyToMany
private List<Input> inputs1;
}
Assuming that Inputs defines its primary table as "input", the
JPA-compliant naming would be "ptx_input". That is what happens on 4.3
using EJB3NamingStrategy. It is actually also what happens on master using
ImplicitNamingStrategyJpaCompliantImpl.
However, the "legacy" part I cannot figure out. Unless I misremember, back
in the day we used to interpret these based on the attribute name, rather
than the associated table name. So here we'd have "ptx_inputs1". That is
in fact what ImprovedNamingStrategy does on 4.3. But I
believe ImprovedNamingStrategy is not the default on 4.3. Again, between
NamingStrategy and NamingStrategyDelegate and NamingStrategyDelegator it is
VERY hard to understand what it going on, so maybe I just missed
something. Anyway, on 4.3 setting no naming strategy forces this to behave
in a JPA-compliant way, meaning the implicit name here is "ptx_input" when
I do not specify anything for NamingStrategy(Delegat(e/or)). So either
that got screwed up in 4.2/4.3 (whenever those new indirections where
added) or I simply misremember what we used to do here.
Are you talking about the generated table name, or the foreign key name? I
see that the test case attached to HHH-9908 uses Spring. Do you have a test
case for this that does not use Spring?
HHH-9390 fixed a bug when generating the default foreign key name in a
unidirectional many-to-many that refers to the owner.
Ih JSR 388, 2.10.5.2 Unidirectional ManyToMany Relationships:
"Entity A is mapped to a table named A.
Entity B is mapped to a table named B.
There is a join table that is named A_B (owner name first). This join table
has two foreign key columns. One foreign key column refers to table A and
has the same type as the primary key of table A. The name of this foreign
key column is formed as the concatenation of the following: the name of
entity A; " _"; the name of the primary key column in table A. The other
foreign key column refers to table B and has the same type as the primary
key of table B. The name of this foreign key column is formed as the
concatenation 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 legacy behavior differed for the first FK:
"The name of this foreign key column is formed as the concatenation of the
following: the name of entity A; " _"; the name of the primary key column
in table A."
The legacy behavior was to use the table name (not the entity name).
The JPA-compliant behavior is provided by
ImprovedNamingStrategyDelegator#jpaNamingStrategyDelegate,
which, by default, is of type JpaNamingStrategyDelegate. It will properly
use the entity name.
This difference is illustrated in
org.hibernate.test.annotations.manytomany.defaults.DefaultNamingManyToManyTest#testUnidirOwnerEntityNamePrimaryTableOverride
and extended by ImprovedManyToManyDefaultsTestFor (this was done before you
mentioned your strong dislike for testing using inheritance...):
As far as I know, collection table naming and the other FK (that references
the associated entity) were unchanged by my fixes.
Also, the spec wrt the join table name and FKs for bidirectional
many-to-many is different from unidirectional. I did not find any problems
with how Hibernate was generating the join table or FKs for bidirectional
many-to-many.
If there is a specific case that doesn't look right, please create a test
case that reproduces it and I'll take a look.
_______________________________________________
hibernate-dev mailing list
hibernate-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev