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

时间:2013-04-07 11:41:12

标签: 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]生成的标识符:200,使用策略:org.hibernate.id.MultipleHiLoPerTableGenerator

entites由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规范时就已经完成了。为什么在新案例中不会发生这种情况?

1 个答案:

答案 0 :(得分:1)

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

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