[
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",pkjoincolum...@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. If the
relation field does not have ForeignKey annotation, or the ForeignKey
annotation has deleteAction set to DEFAULT:
@OneToOne(cascade=CascadeType.REMOVE)
@ForeignKey(deleteAction=ForeignKeyAction.DEFAULT)
public Unidir1to1B entityb;
this foreign key constraint will not be 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.
was:
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",pkjoincolum...@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.
> 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",pkjoincolum...@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. If
> the relation field does not have ForeignKey annotation, or the ForeignKey
> annotation has deleteAction set to DEFAULT:
> @OneToOne(cascade=CascadeType.REMOVE)
> @ForeignKey(deleteAction=ForeignKeyAction.DEFAULT)
> public Unidir1to1B entityb;
> this foreign key constraint will not be 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.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.