Yes, from my point of view having: <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>
or just: <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> has simply no effect at all. Attributes with ManyToOne or OneToMany relations have no FKs created in the database. Only Indices. You have to actively annotate every single attribute with @ForeignKey. There is no other way of telling OpenJPA to create a foreign key. The docs also say not much about it: http://people.apache.org/~mikedd/nightly.builds/apache-openjpa-2.3.0-SNAPSHOT/docs/docbook/manual.html#ref_guide_mapping_synch You can enable or disable it. An attribute "(ForeignKeys=true)" seems to be not known to the Synchronize mappings. Maybe that would be something like a feature request: "Automatically created ForeignKeys in runtime forward mapping for @ManyToOne relations." In the meantime we will have to annotate every attribute with @ForeignKey. Sebastian 2013/2/7 Maxim Solodovnik <solomax...@gmail.com> > I'm afraid the answer below mean we need to annotate everything explicitly > > ---------- Forwarded message ---------- > From: Kevin Sutter <kwsut...@gmail.com> > Date: Wed, Feb 6, 2013 at 9:33 PM > Subject: Re: No foreign keys created by openJPA > To: Maxim Solodovnik <solomax...@gmail.com> > Cc: users@openjpa.apache.org > > > Hi guys, > I didn't see the properties being used in the persistence.xml file that you > posted... > > But, in any case, these properties are mainly used for reading foreign key > information from the database. During the table mapping processing, there > may be some verification of foreign key constraints as well. This allows > OpenJPA to make more intelligent decisions when submitting SQL statements > in batch to avoid constraint collisions. > > If you are looking for explicit foreign key specifications, then you'll > probably have to use the @ForeignKey annotation. > > Hope this helps, > Kevin > > > On Tue, Feb 5, 2013 at 10:00 PM, Maxim Solodovnik <solomax...@gmail.com > >wrote: > > > Hello Kevin, > > > > I just test both properties (added to the persistence.xml) on MySQL 5.5 > > (InnoDB) > > and foreign keys were created only for the fields annotated with > > @ForeignKey :( > > Is it expected behavior? > > > > openJPA version is 2.2.1 > > > > foreign keys were checked with following SQL: > > SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE > > information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'; > > > > properties were added to the following xml: > > > > > https://svn.apache.org/repos/asf/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml > > > > > > Thanks in advance for your help > > > > > > On Tue, Feb 5, 2013 at 9:58 PM, Kevin Sutter <kwsut...@gmail.com> wrote: > > > >> Hi Sebastian, > >> There are two ways to get the ForeignKeys automatically processed. > >> > >> <property name="openjpa.jdbc.SynchronizeMappings" > >> value="buildSchema(ForeignKeys=true)"/> > >> > >> Since you were already using a variation of this property, maybe this is > >> the easiest mechanism. A very similar capability is provided by the > >> Schema > >> Factory [1]: > >> > >> <property name="openjpa.jdbc.SchemaFactory" > >> value="native(ForeignKeys=true)"/> > >> > >> And, of course, there is the manual means of specifying the ForeignKeys > >> via > >> the @ForeignKey annotation. > >> > >> Hope this helps, > >> Kevin > >> > >> [1] > >> > >> > http://people.apache.org/~mikedd/nightly.builds/apache-openjpa-2.3.0-SNAPSHOT/docs/docbook/manual.html#ref_guide_schema_info_factory > >> > >> On Tue, Feb 5, 2013 at 1:07 AM, seba.wag...@gmail.com < > >> seba.wag...@gmail.com > >> > wrote: > >> > >> > We are using MySQL with InnoDB and OpenJPA 2.2.1 > >> > > >> > We face an issue in the automatic table schema creation: > >> > Indices are created but no foreign keys. > >> > > >> > We are using this configuration file: > >> > > >> > > >> > http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/META-INF/mysql_persistence.xml?view=markup > >> > > >> > I guess this is all what configures our schema creation: > >> > <property name="openjpa.jdbc.SynchronizeMappings" > value="buildSchema"/> > >> > > >> > What I would expect is for example for attributes/mapping like > (example > >> 1 > >> > simple ManyToOne association): > >> > @ManyToOne(fetch = FetchType.EAGER) > >> > @JoinColumn(name = "roomtypes_id") > >> > private RoomType roomtype; > >> > > >> > That the attribute roomtypes_id will be created together with a FK and > >> and > >> > Indice. However Only Indice is created no FK. > >> > > >> > The same for any attribute that has a ManyToOne or OneToMany or > >> ManyToMany > >> > annotation. > >> > > >> > So the question is: > >> > Is there a config value for SynchronizeMappings that automatically > >> creates > >> > not only the Indices but also the FK's for those relations? > >> > Or do we really need to annotate every attribute with @ForeignKey? > >> > > >> > Bonus question :) > >> > How would that work with a one-sided one-many association without a > >> cross > >> > table? > >> > > >> > For example (example 2 one-sided one-many association) > >> > @OneToMany > >> > @ElementJoinColumn(name = "whiteboarditem_id", > referencedColumnName > >> = > >> > "id") > >> > private Collection<WhiteboardItem> roomItems; > >> > > >> > If I add: > >> > @ForeignKey(enabled = true) > >> > to example 1 => ForeignKey is created by SchemaTool > >> > to example 2 => ForeignKey is _not_ created by SchemaTool > >> > > >> > How can I make SchemaTool to create FK in example 2? > >> > > >> > > >> > Thanks! > >> > Sebastian > >> > -- > >> > Sebastian Wagner > >> > https://twitter.com/#!/dead_lock > >> > http://www.webbase-design.de > >> > http://www.wagner-sebastian.com > >> > seba.wag...@gmail.com > >> > > >> > > > > > > > > -- > > WBR > > Maxim aka solomax > > > > > > > -- > WBR > Maxim aka solomax > -- Sebastian Wagner https://twitter.com/#!/dead_lock http://www.webbase-design.de http://www.wagner-sebastian.com seba.wag...@gmail.com