我创建了以下实体类,其中主键由表生成器计算。
@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/