【发布时间】:2016-04-12 16:19:09
【问题描述】:
运行测试时出错。我得到一个 SQLIntegrityConstraintViolationException。
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL160412141534310' defined on 'CHARACTERS'.
字符类代码
@Entity
@Table(name = "CHARACTERS")
@NamedQueries({
@NamedQuery(name = Character.FIND_ALL, query = "SELECT c FROM Character c")
})
public class Character implements Serializable {
public static final String FIND_ALL = "Character.findAll";
private static final long serialVersionUID = 1L;
@Id
private int id;
@Column(length = 50)
private String name;
public Character() {
}
public Character(int id, String name) {
this.id = id;
this.name = name;
}
public Character(String name) {
this.name = name;
}
/* Getter and setter below */
CharactersBean 类
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class CharactersBean implements Serializable {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
EntityManager em;
public void save(Character e) {
em.persist(e);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void commitChanges() {
}
public List<Character> get() {
return em.createNamedQuery(Character.FIND_ALL, Character.class).getResultList();
}
测试类 当它执行 should_update_characters_after_transaction_flush 时,会抛出上述异常。
@RunWith(Arquillian.class)
public class ExtendedPersistenceContextTest {
@PersistenceContext
EntityManager em;
@EJB
CharactersBean bean;
@Deployment
public static WebArchive deploy() {
return ShrinkWrap.create(WebArchive.class)
.addPackage("org.javaee7.jpa.extended.pc")
.addAsResource("META-INF/persistence.xml")
.addAsResource("META-INF/create.sql")
.addAsResource("META-INF/drop.sql")
.addAsResource("META-INF/load.sql");
}
@Before
public void setup() {
Character wil = new Character(8, "Wil Wheaton");
bean.save(wil);
for (Character c : bean.get()) {
if ("Raj".equals(c.getName())) {
c.setName("Rajesh Ramayan");
bean.save(c);
}
}
}
@Test
@InSequence(1)
public void should_not_persist_changes_without_transaction_flush() {
List<Character> characters = em.createNamedQuery(Character.FIND_ALL, Character.class).getResultList();
Character raj = em.find(Character.class, 6);
assertThat(characters, hasSize(7));
assertThat(raj.getName(), is(equalTo("Raj")));
}
@Test
@InSequence(2)
public void should_update_characters_after_transaction_flush() {
//when
bean.commitChanges();
//then
List<Character> characters = em.createNamedQuery(Character.FIND_ALL, Character.class).getResultList();
Character rajesh = em.find(Character.class, 6);
Character wil = em.find(Character.class, 8);
assertThat(characters, hasSize(8));
assertThat(rajesh.getName(), is(equalTo("Rajesh Ramayan")));
assertThat(wil.getName(), is(equalTo("Wil Wheaton")));
}
数据输入到 Derby 数据库中。
INSERT INTO CHARACTERS("ID", "NAME") VALUES (1, 'Penny')
INSERT INTO CHARACTERS("ID", "NAME") VALUES (2, 'Sheldon')
INSERT INTO CHARACTERS("ID", "NAME") VALUES (3, 'Amy')
INSERT INTO CHARACTERS("ID", "NAME") VALUES (4, 'Leonard')
INSERT INTO CHARACTERS("ID", "NAME") VALUES (5, 'Bernadette')
INSERT INTO CHARACTERS("ID", "NAME") VALUES (6, 'Raj')
INSERT INTO CHARACTERS("ID", "NAME") VALUES (7, 'Howard')
【问题讨论】:
标签: java jpa jakarta-ee derby jboss-arquillian