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;

デバッグ ログで、生成が機能したことを確認しました。

[デバッグ] 生成された識別子: 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 に答える