inserting new entities to the front of an existing List fails when using
GenerationType.IDENTITY
------------------------------------------------------------------------------------------------
Key: OPENJPA-1949
URL: https://issues.apache.org/jira/browse/OPENJPA-1949
Project: OpenJPA
Issue Type: Bug
Components: kernel
Affects Versions: 2.1.0
Environment: ms sql server
Reporter: Vermeulen
This problem occurs when I try to insert new entities to an existing list and I
use a generated identity with GenerationType.IDENTITY.
I start with a fresh database and let OpenJPA create the schema. I have a
ProductOrder entity that contains a List of ProductOrderLines, annotated as
such:
@Entity
public class ProductOrder {
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<ProductOrderLine> products = new
ArrayList<ProductOrderLine>();
...
}
The entity in the List (ProductOrderLine) has a generated id with
GenerationType.IDENTITY.
@Entity
public class ProductOrderLine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
I start with a ProductOrder that has these products:
1 - orange
2 - apple
I insert two new products into the front of the list so that I get:
null - banana
null - pear
1 - orange
2 - apple
Then I merge the entity (I work with attach/detach, not sure if this matters).
OpenJPA merge correctly returns a ProductOrder with this list:
3 - banana
4 - pear
1 - orange
2 - apple
However OpenJPA generates the wrong SQL so that the database contains something
completely different and indeed selecting the ProductOrder by it's id gives:
3 - banana
4 - pear
4 - pear
4 - pear
I tested this with ms sql server 2008 express. (I tried hsqldb but this also
suffers from bug OPENJPA-1066).
This problem does not occur when I use GenerationType.TABLE for
ProductOrderLine. My example uses a join table, but foreign key columns seem to
have the same problem.
Different workarounds I found:
- Use another GenerationType for the id column
- add the new entities to the end of the List
- (somehow only works in the toy example not in our application) replace the
entire list reference to a new ArrayList containing the same elements in the
same order
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira