下面是我的测试代码:
package jee.jpa2;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@Test
public class Tester {
EntityManager em;
EntityTransaction tx;
EntityManagerFactory emf;
@BeforeClass
public void setup() {
emf = Persistence.createEntityManagerFactory("basicPU", System.getProperties());
}
@Test
public void insert() {
Item item = new Item();
for (int i = 0; i < 1000; ++i) {
em = emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
item.setId(null);
em.persist(item);
tx.commit();
em.clear();
em.close();
tx=null;
em=null;
}
}
@Test
public void read() {
em = emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
Query findAll = em.createNamedQuery("findAll");
List<Item> all = findAll.getResultList();
for (Item item : all) {
System.out.println(item);
}
tx.commit();
}
}
这是实体:
package jee.jpa2;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
@Entity
@NamedQuery(name="findAll", query="SELECT i FROM Item i")
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, updatable= false)
protected Long id;
protected String name;
public Item() {
name = "Digambar";
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return String.format("Item [id=%s, name=%s]", id, name);
}
}
执行测试后出现错误:
Item [id=1, name=Digambar]
Item [id=2, name=Digambar]
PASSED: read
FAILED: insert
<openjpa-2.0.0-r422266:935683 nonfatal store error> org.apache.openjpa.persistence.EntityExistsException: Attempt to persist detached object "jee.jpa2.Item-2". If this is a new instance, make sure any version and/or auto-generated primary key fields are null/default when persisting.
FailedObject: jee.jpa2.Item-2
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2563)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2423)
at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1069)
at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:705)
at jee.jpa2.Tester.insert(Tester.java:33)
请解释这里发生了什么?