【问题标题】:sequence does not exist, hibernate and JPA 2.1序列不存在,休眠和JPA 2.1
【发布时间】:2018-09-28 23:52:35
【问题描述】:

我收到一个错误提示

`Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist`

当我尝试创建用户时发生此错误。

  @RequestMapping(method = POST)
    public UserDto createUser(@RequestBody userDto user) {
        Preconditions.checkNotNull(user);

        return Preconditions.checkNotNull(service.create(user));
    }

但是我可以deleteget 只是不能createupdate。同样令人沮丧的是,我在尝试update 时没有收到任何错误,但事实并非如此。

我没有得到任何关于去哪里寻找的真正线索。我尝试了许多不同的方法来解决这个问题。

我找到了一个帖子:

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCE1")
@SequenceGenerator(name="SEQUENCE1", sequenceName="SEQUENCE1", allocationSize=1)
private int user_id;

在这个链接:SOF link

它抱怨我用 netbeans 生成的这个实体,我目前正在使用 Intellij。任何意见,将不胜感激。

【问题讨论】:

  • 运行SELECT COUNT(*) FROM user_sequences WHERE sequence_name = 'SHOP_SEQ'; 时会发生什么?对CAMPAIGN_SEQ 执行相同操作。
  • 请在您创建活动实体的位置添加代码示例
  • 你能调试一下Dao层自动执行的确切查询吗?
  • @SHIVOMPANDEY 我正在输出查询。我声明这是 application.properties

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


【解决方案1】:

转到您的应用程序属性文件并将 hibernate.hbm2ddl.auto=true; Hibernate 创建这个序列并添加一个新行可能会有所帮助

【讨论】:

    【解决方案2】:

    创建新Campaign 实体的代码似乎不正确。

    public CampaignDto create(CampaignDto campaignDto) {
        Campaign campaign = mapper.mapReverse(campaignDto);
    
        System.out.println(campaign.toString());
    
        // Following 2 lines must be added to obtain and use managed Shop entity
        Shop existingShop = shopRepository.findOne(campaignDto.getShopId());
        campaign.setShop(existingShop);
    
        campaign = campaignRepository.save(campaign);
        CampaignDto createdCampaign = mapper.map(campaign);
    
        return createdCampaign;
    }
    

    【讨论】:

    • @Drew1208 确保它是在 DB 中创建的,否则需要手动创建。 CREATE SEQUENCE CAMPAIGN_SEQ; COMMIT;(或您使用的任何名称)
    • Emmm, DEV_STAG.CAMPAIGN_CHECK_STATUS_TYPE 似乎与您迄今为止发布的代码/方案无关。这个约束里面有什么?怎么插入Shop记录?
    • 当然您可以使用不同的代码组合,但问题的根源在于您的数据库,因为您无法正确插入 shop_table 记录。尝试截断shop_table(或任何名称)并插入第一家商店insert into shop_table (id, ...) values (shop_seq.nextval, ...)
    【解决方案3】:

    您在创建新的Campaign 时似乎没有设置Campaign.shopId 字段。

    @JoinColumn(name = "SHOP_ID", referencedColumnName = "SHOP_ID")
    @ManyToOne(optional = false)
    private Shop shopId;
    

    您可能希望将此字段重命名为 shop 以明确它所包含的内容,因为它不仅仅是一个标识符。

    根据您持久化新对象的方式,您可能需要在@ManyToOne 上添加CascadeType.ALL,以确保新的Shop 与新的Campaign 一起持久化。

    @ManyToOne(optional = false, cascade = CascadeType.ALL)
    

    【讨论】:

    • 您确定您的SequenceGenerator 和JPA 方言正确支持BigDecimal 数据类型吗?看起来它目前无法保持 BigDecimal 值。这可能取决于 JPA 方言,但通常更容易将 id 字段定义为 long
    • 在持久化Campaign 之前是否持久化了Shop 对象?如果是这样,请添加显示您如何操作的代码。您在问题中的映射仍然没有按照我的回答中的建议使用级联。
    猜你喜欢
    • 2014-12-26
    • 2018-05-15
    • 2019-03-04
    • 2016-01-03
    • 2017-09-30
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多