【问题标题】:ID created by Table Generator is not persisted to object表生成器创建的 ID 不会持久化到对象
【发布时间】:2013-04-07 11:41:12
【问题描述】:

我创建了以下实体类,其中主键由表生成器计算。

@SuppressWarnings("serial")
@Entity
public class Article implements Serializable {

    @Id
    @TableGenerator(name = "ARTICLE_TABLE_GEN", table = "sequences", pkColumnName = "seq_name", valueColumnName = "seq_count", pkColumnValue = "ART_SEQ")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "ARTICLE_TABLE_GEN")
    private long id;

在调试日志中,我读到生成工作正常。

[DEBUG] 生成标识符:200,使用策略:org.hibernate.id.MultipleHiLoPerTableGenerator

实体由 JpaRepository 管理。

@Repository
public interface IArticleRepository extends JpaRepository<Article, Long> {

    List<Article> findByShortTextLike(String shortText);
}

在 Java 代码中,我通过服务访问此存储库。

@Service
public class ArticleService implements IArticleService {

    @Autowired
    private IArticleRepository articleRepository;

    @Override
    @Transactional(readOnly = true)
    public Article getArticleByID(long id) {
        return this.articleRepository.findOne(id);
    }

    @Override
    @Transactional
    public Article createArticle(String shortText, String longText,
            String packageUnit, double weight, String group, char abcClass) {

        if (getArticleByShortText(shortText).size() == 0) {
            Article article = new Article();
            article.setShortText(shortText);
            article.setDescription(longText);
            article.setPackageUnit(packageUnit);
            article.setWeight(weight);
            article.setMaterialGroup(group);
            article.setClassABC(abcClass);
            this.articleRepository.saveAndFlush(article);
            return article;
        } else
            return null;
    }

    @Override
    @Transactional(readOnly = true)
    public List<Article> getArticleByShortText(String short_text) {
        return this.articleRepository.findByShortTextLike(short_text);
    }
}

在服务方法“createArticle”调用存储库以将新实例保存并刷新到数据库后,完美完成。但是,生成的 ID 不会写入方法返回的对象中。

我记得这是在我对数据库列使用 AUTO_INCREMENT 规范时完成的。为什么在新案例中没有发生这种情况?

【问题讨论】:

  • 向我们展示存储库的代码,并向我们展示您如何调用此存储库并返回实体。
  • @JBNizet:这对你来说应该没问题。

标签: java spring hibernate jpa spring-data-jpa


【解决方案1】:

我没有使用 Spring-data-JPA 的经验,但是 saveAndFlush() 的 javadoc 显示它返回一个实体。所以它可能在内部使用EntityManager.merge()。尝试将您的代码更改为

article = this.articleRepository.saveAndFlush(article);
return article;

【讨论】:

  • 好的,很简单,虽然我阅读了javadoc,但不知何故无法推导出这段代码。 @JBNizet:再次感谢您的帮助。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多