首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将新实体插入数据库时出错,因为它与重复的键值冲突

将新实体插入数据库时出错,因为它与重复的键值冲突
EN

Stack Overflow用户
提问于 2014-09-09 15:42:26
回答 2查看 995关注 0票数 0

我试图创建CRUD测试来显示我的JPA程序工作,但是当我创建一个新的实体并将它提交到数据库时,它给了我奇怪的错误。该表供应商只有一个禁忌,这是一个独特的索引,是自动生成。我会先把课程发出来,然后再把我想做的事发出来。

下面是用于表和违禁品的SQL

-表供应商的DDL

代码语言:javascript
复制
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)
);

-对表供应商的限制

代码语言:javascript
复制
ALTER TABLE SUPPLIER ALTER SUPPLIERID NOT NULL;

ALTER TABLE SUPPLIER ALTER COMPANYNAME NOT NULL;

ALTER TABLE SUPPLIER ADD CONSTRAINT PK_SUPPLIER PRIMARY KEY (SUPPLIERID);

这是我的供应商主钥匙:

代码语言:javascript
复制
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "SUPPLIERID")
private Integer supplierid;

因此,首先创建实体并将其添加到实体管理器中。

代码语言:javascript
复制
  Supplier sup = new Supplier("Test","Test","Test","Test","Test","Test","Test","Test","Test");
  em.persist(p);

那我就把它存起来

代码语言:javascript
复制
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 )

EN

回答 2

Stack Overflow用户

发布于 2014-09-09 17:21:42

保存方法让我有点恼火。就像上面写的那样,它执行一个空事务,不是吗?不是应该是这样的吗?

代码语言:javascript
复制
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();
    ...
}

会不会,这个问题的编码被缩短得太多了,从而影响了这幅画?从交易开始到提交,你能提供完整的代码吗?

我记得有一段时间,我也有过类似的问题。主要的一点是,我试图在一个事务中坚持两次--这是不可能的--抱怨一个重复的关键问题。也许这是对你案子的暗示。

票数 0
EN

Stack Overflow用户

发布于 2014-09-09 20:04:42

好的,在经历了很多困难之后,我找到了问题的原因。

如果您尝试将一个带有空pk的实体提交(entitymanager.getTransaction.commit())到数据库,那么即使数据库应该提供id,它也无法工作。

每次我需要一个新的对象时必须做的事情,在这个状态下,它可以保存到db中。

代码语言:javascript
复制
 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合并和提交,但我觉得我做了一个无效的解决方案与数据库事务,我有。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25748817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档