Hi Patrick,
Thanks for your response. I did see in documentation the note on
specifying the mapping of a bidirectional relation on only one side of
the relation, but in my case the nature of the bidirectional
relationship is a bit more constrained: the A to B relation is ordered,
whereas the B to A relation is unordered. I'm not aware of any mechanism
in JPA by which I can specify an "orderBy" column within a join table,
so I'm at a loss here.
Thanks,
Andy
Patrick Linskey wrote:
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