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?
Hi,
In JPA 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 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.
References
- JPA 1.0 specification
- 2.1.8.2 Bidirectional ManyToOne / OneToMany Relationships
- 2.1.8.5.1 Unidirectional OneToMany Relationships
- 9.1.6 JoinColumn Annotation (discusses in which context this annotation can be used)
- JPA Wiki Book