openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Fay Wang (JIRA)" <j...@apache.org>
Subject [jira] Updated: (OPENJPA-1057) Foreign keys are not properly set for ConstraintUpdateManager to determine the correct order of the sql
Date Sat, 02 May 2009 00:39:30 GMT

     [ https://issues.apache.org/jira/browse/OPENJPA-1057?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Fay Wang updated OPENJPA-1057:
------------------------------

    Description: 
In the following situations, foreign keys are not properly set in the RowImpl for ConstraintUpdateManager
to correctly determine the order of sql:

(1) bottom-up table creation for primary table and secondary table with foreign key referencing
the primary table: Both primary and secondary tables are used to store the data in an entity,
which has the annotation as below:

   @Table(name="Tbl1")   
   @SecondaryTable(name="Tbl2",pkJoinColumns=@PrimaryKeyJoinColumn(name="ID"))   
   public class EntityA implements Serializable {
 
...
    }

In this situation, Openjpa fails to record the foreign key information in the secondary row.
Without the foreign key constraint information, the ConstraintUpdateManager is unable to determine
the ordering correctly.

(2) bottom up table creation for an entity and its toOne/toMany relation with foreign key
constraint. For example:

create table Bidir1to1A (id integer not null, age integer not null, name varchar(30), primary
key (id));
create table Bidir1to1B (id integer not null, name varchar(30), entitya_id integer, primary
key (id));
alter table Bidir1to1B add constraint FK452ACC2BD7410520 foreign key (entitya_id) references
Bidir1to1A;

In this situation, Openjpa reads in the database foreign key constraint. However, this foreign
key constraint is not recorded in the RowImpl due to the deleteAction = ForeignKey.ACTION_NONE.
The lack of foreign key constraint information in the RowImpl leads to the wrong ordering
of the sql by the ConstraintUpdateManager.

(3) top-down table creation with the following entity defintion:

@Entity
@Table(name="EntityA")   
public class Unidir1to1A implements IUnidir1to1A, Serializable {

    private static final long serialVersionUID = -1734942085082845941L;

    @Id
    Integer id;

    @OneToOne(cascade=CascadeType.REMOVE)  
    @ForeignKey(deleteAction=ForeignKeyAction.DEFAULT)
    public Unidir1to1B  entityb;

The deleteAction set to ForeignKeyAction.DEFAULT is translated to ForeignKey.ACTION_NONE (for
DB2 at least). As in case (2) above, this leads to missing foreign key constraint in the RowImpl,
resulting in wrong ordering of the sql.

Note that the wrong ordering of sql means that the sql that insert into the parent table is
not executed prior to the sql that insert into the child table.

The fix is:
(1) add foreign key constraint to the RowImpl when @SecondaryTable is used
(2) record foreign key constraint regardless of ForeignKey delete action.   



















  was:ConstraintUpdateManager fails to order the update/insert/delete rows properly when @SecondaryTable
is used to store the entity in different tables.

        Summary: Foreign keys are not properly set for ConstraintUpdateManager to determine
the correct order of the sql  (was: ConstraintUpdateManager fails to order the update/insert/delete
rows properly when @SecondaryTable is used)

> Foreign keys are not properly set for ConstraintUpdateManager to determine the correct
order of the sql
> -------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-1057
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1057
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jdbc
>    Affects Versions: 2.0.0
>            Reporter: Fay Wang
>            Assignee: Fay Wang
>             Fix For: 2.0.0
>
>
> In the following situations, foreign keys are not properly set in the RowImpl for ConstraintUpdateManager
to correctly determine the order of sql:
> (1) bottom-up table creation for primary table and secondary table with foreign key referencing
the primary table: Both primary and secondary tables are used to store the data in an entity,
which has the annotation as below:
>    @Table(name="Tbl1")   
>    @SecondaryTable(name="Tbl2",pkJoinColumns=@PrimaryKeyJoinColumn(name="ID"))   
>    public class EntityA implements Serializable {
>  
> ...
>     }
> In this situation, Openjpa fails to record the foreign key information in the secondary
row. Without the foreign key constraint information, the ConstraintUpdateManager is unable
to determine the ordering correctly.
> (2) bottom up table creation for an entity and its toOne/toMany relation with foreign
key constraint. For example:
> create table Bidir1to1A (id integer not null, age integer not null, name varchar(30),
primary key (id));
> create table Bidir1to1B (id integer not null, name varchar(30), entitya_id integer, primary
key (id));
> alter table Bidir1to1B add constraint FK452ACC2BD7410520 foreign key (entitya_id) references
Bidir1to1A;
> In this situation, Openjpa reads in the database foreign key constraint. However, this
foreign key constraint is not recorded in the RowImpl due to the deleteAction = ForeignKey.ACTION_NONE.
The lack of foreign key constraint information in the RowImpl leads to the wrong ordering
of the sql by the ConstraintUpdateManager.
> (3) top-down table creation with the following entity defintion:
> @Entity
> @Table(name="EntityA")   
> public class Unidir1to1A implements IUnidir1to1A, Serializable {
>     private static final long serialVersionUID = -1734942085082845941L;
>     @Id
>     Integer id;
>     @OneToOne(cascade=CascadeType.REMOVE)  
>     @ForeignKey(deleteAction=ForeignKeyAction.DEFAULT)
>     public Unidir1to1B  entityb;
> The deleteAction set to ForeignKeyAction.DEFAULT is translated to ForeignKey.ACTION_NONE
(for DB2 at least). As in case (2) above, this leads to missing foreign key constraint in
the RowImpl, resulting in wrong ordering of the sql.
> Note that the wrong ordering of sql means that the sql that insert into the parent table
is not executed prior to the sql that insert into the child table.
> The fix is:
> (1) add foreign key constraint to the RowImpl when @SecondaryTable is used
> (2) record foreign key constraint regardless of ForeignKey delete action.   

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message