JPA:InvalidStateException错误+ Composite Key / EmbeddableId / Sequence生成的ID

时间:2011-08-28 16:54:56

标签: java jpa persistence composite-key

我目前使用OpenJPA使用我的数据库和Java应用程序设置了一个模式,大部分时间都可以使用,但有时我会收到一些用户的错误:

org.apache.openjpa.persistence.InvalidStateException:尝试将列“table1.ID”设置为两个不同的值

table1实际上有一个复合键(两个值),该键中的每个值都是另一个表的外键。我使用RSA(Rational Software Architect)为我设置实体(生成代码)。它在table1的Entity类中设置了一个PK类(使用@EmbeddableId来引用PK类),然后在同一个table1实体类(以及那些列引用的实体类中)中设置两个@ManyToOne关系,因为它们是外键

现在,正如我上面提到的,复合键中的每个值都是一个外键。好吧,这些外键中的每一个实际上都是在自己的实体类中使用外部Sequencer生成的。我正在使用DB2并在列上使用@GeneratedValue(即table2和table3的实体类中的ID)。我也为每个使用strategy = GenerationType.SEQUENCE。

同样,一切都是有效的,但不是100%的时间,我不确定为什么。通过消除所有内容并重置序列生成器,我已经摆脱了这个错误,但我知道这绝对不是一个解决方案。它是否与数据库中的两个Composite Key值是使用序列生成的列的外键这一事实有关,但PK实体可能不知道?

我也注意到它只适用于在Users表中有记录的用户(上面提到的一个外键是Users表,而另一个FK是另一个表)。如果用户不在表中,它会创建一个,例如:

User newUser = userManager.getNewUser();
newUser.setName(..);
newUser.setEmail(..);
...

完成后,我上面提到的PK类创建了一个新实例,然后调用另一个表。上面用户的ID被传递到PK。像:

PK newPK = pkManager.getNewPK();
newPk.setAID(newUser.getID());

有没有人碰到这个?任何解决方案?

1 个答案:

答案 0 :(得分:0)

抱歉,解决了这个问题。我查看了我的代码并意识到我忘了重构一行代码(改变数据模型)。​​