【问题标题】:JPA/Spring-boot Duplicate entry for key 'PRIMARY'JPA/Spring-boot 键“PRIMARY”的重复条目
【发布时间】:2019-04-04 08:59:39
【问题描述】:

我正在使用 JPA 进行 mysql 操作,但有几次我在通过 JPA 执行 mysql 保存操作时遇到错误。 执行保存操作时出错 =>

无法打开 JPA EntityManager 进行事务处理;键“P​​RIMARY”的重复条目

表模型类:

@Entity
@Table(name="table_x")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
@TypeDefs({
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class),
})
public class tableX implements Serializable {

    @Id
    @Column(name="product_id")
    private Long productId;

    @Column(name="parent_id")
    private Long parentId;

    // other fields
}

Mysql 架构:

 CREATE TABLE `table_x` (
  `product_id` int(12) unsigned NOT NULL,
  `parent_id` int(12) unsigned DEFAULT NULL,
  // other fields
  PRIMARY KEY (`product_id`)
)

存储库类:

@Repository
public interface TableXRepository extends CrudRepository<tableX,Long> {
}

Mysql操作类:

@Component
@Transactional
public class tableXoperationImpl implements ItableXoperation {

    @Autowired
    private TableXRepository tableXRepository;

    public void save(tableX data) {
        tableXRepository.save(data);
    }
}

是什么,我在这里失踪,任何帮助将不胜感激。

【问题讨论】:

  • 您能否添加更多日志文件,是否有测试源代码或调用 ITableX 操作接口的客户端代码。作为一点,java中的类名应该是小写的。
  • 你用来执行保存操作的数据是什么。你会使用重复的product_id
  • @IsharaMadhawa 我认为,如果您使用相同的 product_id 保存文档,如果文档已经存在,jpa 将更新代替插入..

标签: mysql spring-boot jpa spring-data-jpa


【解决方案1】:

请在productId 上使用@GeneratedValue(strategy = GenerationType.AUTO)

【讨论】:

    【解决方案2】:

    我认为您的列 product_id 存在问题,它实际上定义为表中的主键。

    @Id  //this annotation make column as primary key.
    @Column(name="product_id")
    private Long productId;
    

    您可以自己分配productId,也可以分配Id 生成策略 Primary Key Id Generation Strategy Type

    如果您决定自己分配 productId,那么它必须是唯一的(在该表(产品)的该列中不存在)。

    如果您仔细查看您的异常,您会发现 Duplicate entry for key 'PRIMARY' ,这意味着尝试在表 (Product) 的主键列 (product_id) 中插入重复值。

    或者你可以用这个替换上面的主键列代码

    @GeneratedValue(strategy=GenerationType.AUTO) // automatically generated primary key.
    @Id  // Primary key.
    @Column(name="product_id")
    private Long productId;
    

    谢谢:)

    【讨论】:

    • 据我所知,如果您再次通过jpa保存文档,如果文档已经存在,它将更新该文档。
    • @AmitKumar 是的,它是正确的.. 但是你应该为主键列分配一个 generationType 可能会解决你的问题..
    • @AmitKumar 请至少参考一次baeldung.com/spring-data-crud-repository-save
    • Vikrant Kashyap,您好,我不能输入自动生成类型,因为我正在使用来自 kafka 管道的数据并保存到 mysql,所以所有参数都来自那里,感谢您的链接,我已经完成了给定链接,我只是想知道为什么 jpa 保存抛出错误它应该在重复文档的情况下更新,而且我还多次使用同一个文档执行了保存操作测试用例,但我没有收到错误
    猜你喜欢
    • 2016-10-25
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2012-07-23
    • 2013-09-30
    相关资源
    最近更新 更多