0

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

@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 规范时完成的。为什么在新案例中不会发生这种情况?

4

1 回答 1

1

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

article = this.articleRepository.saveAndFlush(article);
return article;
于 2013-04-07T16:59:53.787 回答