Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@OneToMany without inverse relationship and without a join table?

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?

like image 779
jsight Avatar asked Jan 19 '10 18:01

jsight


People also ask

Can a JPA entity have multiple OneToMany associations?

You can have multiple one-to-many associations, as long as only one is EAGER.

What is difference between OneToMany and ManyToOne?

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).

What is unidirectional and bidirectional in JPA?

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.

How do you map the one-to-many relationships both unidirectional or bidirectional?

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.


2 Answers

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.

like image 200
Arthur Ronald Avatar answered Oct 09 '22 00:10

Arthur Ronald


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 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 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 table B.

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
    • 2.1 Undirectional OneToMany, No Inverse ManyToOne, No Join Table (JPA 2.0)
like image 37
Pascal Thivent Avatar answered Oct 08 '22 22:10

Pascal Thivent