我创建了以下实体类,其中主键由表生成器计算。
@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规范时就已经完成了。为什么在新案例中不会发生这种情况?
答案 0 :(得分:1)
我没有使用Spring-data-JPA的经验,但saveAndFlush()的javadoc显示它返回一个实体。所以它可能在内部使用EntityManager.merge()
。尝试将代码更改为
article = this.articleRepository.saveAndFlush(article);
return article;