I worked around my issue by having all of my ManyToMany fields annotated like:

        @ManyToMany
        @JoinTable(joinColumns = { @JoinColumn(nullable = false) }, 
inverseJoinColumns = { @JoinColumn(nullable = false) })
        private List<MailingList> mailingLists = new ArrayList<MailingList>();

This ensures that the columns are generated as non nullable. The boilerplate 
code in @JoinTable can simply be copy/pasted to each ManyToMany field.
For each join table I add the primary key by filling the following SQL with the 
table and column names that are generated by OpenJPA:

ALTER TABLE [dbo].[$table$]  ADD  CONSTRAINT PK_$table$ PRIMARY KEY CLUSTERED
(
 $col1$ ASC,
 $col2$ ASC
)


-----Oorspronkelijk bericht-----
Van: Henno Vermeulen [mailto:he...@huizemolenaar.nl] 
Verzonden: donderdag 20 september 2012 16:48
Aan: 'users@openjpa.apache.org'
Onderwerp: RE: no primary key on generated join table

To only partially answer my own question, I can have OpenJPA generate a unique 
constraint when I add something like:

        @ManyToMany
        @JoinTable(joinColumns = { @JoinColumn(name = "CONTACT_ID") }, 
        inverseJoinColumns = { @JoinColumn(name = "MAILINGLISTS_ID") }, 
        uniqueConstraints = { @UniqueConstraint(columnNames = {
                        "CONTACT_ID", "MAILINGLISTS_ID" }) })
        private List<MailingList> mailingLists = new ArrayList<MailingList>();

Here I used the default column names that OpenJPA generates for me.
However this is not a primary key. Plus I think it's rather ugly having to add 
boiler plate like this; isn't JPA intended to minimize having to write 
boilerplate code?


-----Oorspronkelijk bericht-----
Van: Henno Vermeulen [mailto:he...@huizemolenaar.nl] 
Verzonden: donderdag 20 september 2012 16:37
Aan: 'users@openjpa.apache.org'
Onderwerp: no primary key on generated join table

When I use @ManyToMany on a List or Set and let OpenJPA generate my database 
schema, it creates a join table with two foreign key columns that allows 
duplicates.

Is there a way to let OpenJPA generate a compound primary key on both the 
foreign key columns or should I manually add these in the database?
Or is not a problem when a join table has no primary key?


Reply via email to