java - 表生成器创建的 ID 不会持久保存到对象中

标签 java spring hibernate jpa spring-data-jpa

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

@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] Generated identifier: 200, using strategy: 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_INCRMENT 规范时完成的。为什么在新案例中没有发生这种情况?

最佳答案

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

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

关于java - 表生成器创建的 ID 不会持久保存到对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861944/

相关文章:

java - java.time 是否无法解析秒的分数?

java - HQL - 两个相同查询之间的差异

java - Spring @Transactional方法——参与事务

来自简单 SQL 查询的 Hibernate 条件查询(带有嵌套子查询)

java - Spring Hibernate 事务回滚不起作用

java - jirutka/rsql-解析器 : How to define an operator that has no argument?(=空=,=notEmpty=)

java - Google应用引擎部署: JDK not JRE

spring - 如何使长时间运行的@Scheduled spring 方法, hibernate 工作?

java - 将 quartz 添加到项目会破坏 jdbc 数据源

hibernate - HQL JoinTable 无法访问