Hi,

If you're trying to model a bidirectional relationship, you should
only specify mapping info for one side and use the mappedBy annotation
property on the other side of the relation.

-Patrick

On 1/25/08, Andy Schlaikjer <[EMAIL PROTECTED]> wrote:
> Hi all,
>
> I was curious if/how I might get into trouble by reusing a table to
> support mapping of an @Entity as well as a @JoinTable. Here's an example:
>
> I have the following entities A, BRef, and B where a unidirectional
> many-to-many relation between A and B is defined via BRef (acting here
> as an explicit join table):
>
> @Entity
> class A {
>    @Id
>    protected long id;
>
>    @OneToMany(mappedBy = "a")
>    @OrderBy("idx")
>    protected List<BRef> brefs;
> }
>
> @Entity
> @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"a_id",
> "b_id"}))
> class BRef {
>    @Id
>    protected long id;
>
>    @ManyToOne(optional = false)
>    protected A a;
>
>    @ManyToOne(optional = false)
>    protected B b;
>
>    @Basic
>    protected int idx;
> }
>
> @Entity
> class B {
>    @Id
>    protected long id;
> }
>
> With this mapping (using the mysql DBDictionary), the following CREATE
> TABLE statement reflects the BRef table:
>
> CREATE TABLE `BRef` (
>    `id` bigint(20) NOT NULL,
>    `idx` int(11) default NULL,
>    `a_id` bigint(20) default NULL,
>    `b_id` bigint(20) default NULL,
>    PRIMARY KEY  (`id`),
>    UNIQUE KEY `a_id` (`a_id`,`b_id`),
>    KEY `I_BREF_A` (`a_id`),
>    KEY `I_BREF_B` (`b_id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
>
> Now I'd like to extend the mapping to include the reverse many-to-many
> relation from B to A:
>
> @Entity
> class B {
>    @Id
>    protected long id;
>
>    @OneToMany
>    @JoinTable(
>      name = "BRef",
>      joinColumns = @JoinColumn(name = "b_id"),
>      inverseJoinColumns = @JoinColumn(name = "a_id"),
>      uniqueConstraints = @UniqueConstraint(columnNames = {"a_id", "b_id"})
>    )
>    protected Collection<A> as;
> }
>
> When I do this, the CREATE TABLE statement for table "BRef" changes
> slightly (ordering of columns, names of indices):
>
> CREATE TABLE `BRef` (
>    `id` bigint(20) NOT NULL,
>    `idx` int(11) default NULL,
>    `b_id` bigint(20) default NULL,
>    `a_id` bigint(20) default NULL,
>    PRIMARY KEY  (`id`),
>    UNIQUE KEY `a_id` (`a_id`,`b_id`),
>    KEY `I_BREF_B_ID` (`b_id`),
>    KEY `I_BREF_ELEMENT` (`a_id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
>
> So it is clear that the two separate mappings for table "BRef" are
> competing with one another. How else might the OpenJPA runtime be
> affected by this?
>
> Thanks,
> Andy
>


-- 
Patrick Linskey
202 669 5907

Reply via email to