我试图创建CRUD测试来显示我的JPA程序工作,但是当我创建一个新的实体并将它提交到数据库时,它给了我奇怪的错误。该表供应商只有一个禁忌,这是一个独特的索引,是自动生成。我会先把课程发出来,然后再把我想做的事发出来。
下面是用于表和违禁品的SQL
-表供应商的DDL
CREATE TABLE SUPPLIER
( SUPPLIERID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY,
COMPANYNAME VARCHAR(40),
CONTACTNAME VARCHAR(30),
CONTACTTITLE VARCHAR(30),
ADDRESS VARCHAR(60),
CITY VARCHAR(15),
POSTALCODE VARCHAR(10),
COUNTRY VARCHAR(15),
PHONE VARCHAR(24),
FAX VARCHAR(24)
);-对表供应商的限制
ALTER TABLE SUPPLIER ALTER SUPPLIERID NOT NULL;
ALTER TABLE SUPPLIER ALTER COMPANYNAME NOT NULL;
ALTER TABLE SUPPLIER ADD CONSTRAINT PK_SUPPLIER PRIMARY KEY (SUPPLIERID);这是我的供应商主钥匙:
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "SUPPLIERID")
private Integer supplierid;因此,首先创建实体并将其添加到实体管理器中。
Supplier sup = new Supplier("Test","Test","Test","Test","Test","Test","Test","Test","Test");
em.persist(p);那我就把它存起来
public void Save() {
em.getTransaction().begin();
em.getTransaction().commit();
}然后我得到下面的错误,即使认为唯一可以打破的约束是两个相同的pk,但那些是自动生成的。
我知道我的设置可以工作,因为我的另外两个测试(插入其他新实体很好)。我还关闭并重新打开每个测试之间的连接。
EL警告: 2014-09-09 17:17:33.67--UnitOfWork(1407675409)--Exception EclipseLink-4002:org.eclipse.persistence.exceptions.DatabaseException Internal : java.sql.SQLIntegrityConstraintViolationException:语句被中止,因为它会在“供应商”上定义的“PK_SUPPLIER”标识的唯一或主键约束或唯一索引中导致重复的键值。错误代码:-20001来电:插入供应商(地址,城市,COMPANYNAME,CONTACTNAME,CONTACTTITLE,国家,传真,电话,POSTALCODE)值(?,?,?绑定=> 9参数绑定查询: InsertObjectQuery(Peristency.Supplier supplierid=null )
发布于 2014-09-09 17:21:42
保存方法让我有点恼火。就像上面写的那样,它执行一个空事务,不是吗?不是应该是这样的吗?
public void Save() {
...
em.getTransaction().begin();
...
Supplier sup = new Supplier("Test","Test","Test","Test","Test","Test","Test","Test","Test");
em.persist(p);
...
em.getTransaction().commit();
...
}会不会,这个问题的编码被缩短得太多了,从而影响了这幅画?从交易开始到提交,你能提供完整的代码吗?
我记得有一段时间,我也有过类似的问题。主要的一点是,我试图在一个事务中坚持两次--这是不可能的--抱怨一个重复的关键问题。也许这是对你案子的暗示。
发布于 2014-09-09 20:04:42
好的,在经历了很多困难之后,我找到了问题的原因。
如果您尝试将一个带有空pk的实体提交(entitymanager.getTransaction.commit())到数据库,那么即使数据库应该提供id,它也无法工作。
每次我需要一个新的对象时必须做的事情,在这个状态下,它可以保存到db中。
public void addEmployee(Employee p) {
em.getTransaction().begin();
em.persist(p);
//Doesn't have an id
System.out.println(p.getEmployeeid());
em.flush();
//now it has an id!
System.out.println(p.getEmployeeid());
em.getTransaction().commit();
}然后,我可以在我的leasure合并和提交,但我觉得我做了一个无效的解决方案与数据库事务,我有。
https://stackoverflow.com/questions/25748817
复制相似问题