This is a similar problem to "Hibernate @OneToMany without a separate join table", in that I need a @OneToMany relationship without a join table. However, I would also like to not define the inverse relationship. Removing the inverse seems to result in a join table being automatically generated... is there a workaround for this?
You can have multiple one-to-many associations, as long as only one is EAGER.
In a One-To-Many relationship, one object is the "parent" and one is the "child". The parent controls the existence of the child. In a Many-To-Many, the existence of either type is dependent on something outside the both of them (in the larger application context).
The direction of a relationship can be either bidirectional or unidirectional. A bidirectional relationship has both an owning side and an inverse side. A unidirectional relationship has only an owning side.
The best way to map a @OneToMany association is to rely on the @ManyToOne side to propagate all entity state changes. So, the bidirectional @OneToMany association is the best way to map a one-to-many database relationship when we really need the collection on the parent side of the association.
In JPA 2.0+ you can use @JoinColumn as a way to avoid to generate joined table.
Try it.
@OneToMany @JoinColumn(name="COLUMN_NAME")
UPDATE
The info provided above has been extracted from EJB 3.0 o'reilly book (Look for The @JoinColumn annotation references the CUSTOMER_ID column in the PHONE table). However, plain JPA 1.0 specification does not support this feature. What it says is
Unidirectional one-to-many relationships may be implemented using one-to-many foreign key mappings, however, such support is not required in this release. Applications that want to use a foreign key mapping strategy for one-to-many relationships should make these relationships bidirectional to ensure portability
So in 1.0 it is a vendor-specific implementation (And it makes sense, The author works at JBoss - The red hat divison behind the hibernate)
But it is supported by JPA 2.0 implementation
If the join is for a unidirectional OneToMany mapping using a foreign key mapping strategy, the foreign key is in the table of the target entity.
The JPA 1.0 specification does NOT support unidirectional OneToMany mapping without a Join Table.
And using a JoinColumn
on a OneToMany
isn't allowed in standard JPA 1.0 (only on a OneToOne
, ManyToOne
or ManyToMany
). It is in JPA 2.0 though.
From the JPA 1.0 specification:
2.1.8.5.1 Unidirectional OneToMany Relationships
The following mapping defaults apply:
Entity A is mapped to a table named
A
. Entity B is mapped to a table namedB
. There is a join table that is namedA_B
(owner name first). This join table has two foreign key columns. One foreign key column refers to tableA
and has the same type as the primary key of tableA
. 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 tableA
. The other foreign key column refers to table B and has the same type as the primary key of tableB
and there is a unique key constraint on it. 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 tableB
.
To sum up, if you don't want a Join Table (and full read/write support) and still want to be JPA compliant, make the association bidirectional (with an inverse
side).
The wiki book link below discusses a trick (mapping the target table as the join table) to "work around" the problem but this only works for reads, writes won't work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With