openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Heath Thomann (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (OPENJPA-1936) A database 'FOREIGN KEY' constraint is not detected by default
Date Tue, 05 Apr 2011 19:01:06 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-1936?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13016081#comment-13016081
] 

Heath Thomann commented on OPENJPA-1936:
----------------------------------------

I wanted to add a third option to the other two options mentioned in my description as I realize
that adding the SchemaFactory property to each persistent units/persistence.xml files might
be a pain.  As such, I wanted to offer another option which will allow a user to set the property
globally.  That is, OpenJPA offers an optional resource file named openjpa.xml to set configuration
properties, as described here: http://openjpa.apache.org/builds/latest/docs/manual/manual.html#ref_guide_conf_specify.
 An example of the contents of the openjpa.xml file is as follows:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

       <persistence-unit name="">
           <properties>
               <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>
           </properties>
       </persistence-unit>
</persistence>

Notice that the persistence-unit name is blank.  This is expected, the name isn't actually
used.  As the OpenJPA document listed above points out, this file needs to be on the CLASSPATH.
 As an example (but not limited to), a user can place this file in the same location as the
persistence.xml file.  Or, a user can place the file in a .jar file and place the .jar file
in the lib directory of an ear.

Thanks,

Heath

> A database 'FOREIGN KEY' constraint is not detected by default
> --------------------------------------------------------------
>
>                 Key: OPENJPA-1936
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1936
>             Project: OpenJPA
>          Issue Type: Improvement
>    Affects Versions: 2.0.1
>            Reporter: Heath Thomann
>            Assignee: Heath Thomann
>            Priority: Minor
>
> Take the following SQL to create two tables in a database:
> CREATE TABLE PARENT (
>     "ID" INT NOT NULL,
>     PRIMARY KEY ("ID")
>   )
>   
> CREATE TABLE CHILD (
>     "ID" INT NOT NULL,
>     "PARENT_ID" INT,
>     PRIMARY KEY ("ID"),
>     FOREIGN KEY ("PARENT_ID") REFERENCES "PARENT" ("ID")
>   )
> Take the following two entities:
> public class Parent implements Serializable {
>   @Id
>   private int id;
>   @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER,
orphanRemoval = true)
>   private Collection<Child> childs;
> .........
> public class Child implements Serializable {
>   @Id
>   private int id;
>   @ManyToOne
>   private Parent parent;
> .........
> If a scenario is executed in which an existing Parent is removed, an existing Child(s)
associated with the Parent will also be removed given the definition of the @OneToMany relationship.
 However, when OpenJPA executes the SQL to remove the Parent and Child, the SQL to remove
the Parent will be executed first.  Given the 'FOREIGN KEY' constraint on the Child table,
a database will throw some kind of 'constraint violation' exception when a Parent is removed
before its Child (if it were not for the 'FOREIGN KEY' constraint on the Child table, the
SQL order would be fine).  In this case, OpenJPA should execute the SQL to remove the Child
first, then the Parent.  However, by default, OpenJPA knows nothing about the 'FOREIGN KEY'
constraint on the Child table and OpenJPA never assumes that there are database constraints
for relationships.  As a result, OpenJPA does not  take them into account when executing SQL.
 To tell OpenJPA that there are database level constraints, and thus to effect the order of
the SQL in this case, a user can perform one of the following options:
> 1) Use the @ForeignKey annotation (org.apache.openjpa.persistence.jdbc.ForeignKey) in
entities (on the ToOne fields).
> 2) Have OpenJPA read in the table definitions from the database by adding the following
property:
>   <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>
> While either of these two options will properly handle the above scenario, it can be
argued that OpenJPA should detect the 'FOREIGN KEY' constraint, and not require a user to
add an annotation to their code or set a property.  This JIRA will be used to investigate
possible solutions to change the way the constraints are detected.
> Thanks,
> Heath

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message