views:

809

answers:

1

I have a one-to-many relationship modeled using an extra table:

create table t1 (id int primary key, name varchar(10) /*...*/);
create table t2 (id int primary key, name varchar(10) /*...*/);
create table t1_t2 (t1_id int, t2_id int, primary key (t1, t2));

The tables are supposed to model the relationship of one t1 to many t2. What is the right way to mode these tables using JPA?

+1  A: 

Hi

The typical table for one T1 to many T2 is to have a foreign key on T2 pointing toward T1. The T1_T2 table is usually not needed.

The JPA structure would then be a One-To-Many, possibly two-way.


There could be some arrangements, to make the structure you describe work. You could change T1_T2:

  • add a unique constraint on T2 (so that only one T2 is allowed)

Is that really what you want?

Edited: yes, it is what you want ;-)

I doubt you may find many examples on the net. I have no proved solution, but I would try something along these lines:

In Hibernate annotation reference documentation, see "2.2.5.3.2.3. Unidirectional with join table" to get the idea. It looks like:

    @Entity
    public class Trainer {
        @OneToMany
        @JoinTable(
            name="TrainedMonkeys",
            joinColumns = @JoinColumn( name="trainer_id"),
            inverseJoinColumns = @JoinColumn( name="monkey_id")
        )
        public Set<Monkey> getTrainedMonkeys() {
        ...
    }
KLE
Thanks for your reply. It's true that mine is not the most typical structure, but I have other reasons that make it more suitable. The unique constraint on T2 is possible, but I still don't get how I should model it using JPA annotations. Could you please explain further?
Hosam Aly
OK. I'm curious of what could makes this design "more suitable" though. Could you give some hints, to improve my knowledge in case I need this in the future?
KLE
Thank you. That's really informative. As for the design, when the number of records in T2 which are actually related to T1 is relatively small, you may opt to having a separate join table rather than having a `t1_id` in T2 that is mostly `NULL`.
Hosam Aly
Excellent justification. Thanks for sharing ;-) I'll give you my vote !
KLE