我设计了以下数据库表:JPA存储库/ Service设计与复合主键
- “制品”与“materialID”作为主键。
- “supplier”以“supplierID”作为主键。
- 将“materialID”和“supplierID”作为复合主键(包括与表1和表2的外键关系)的“采购”。
现在我想用JPA在Spring中处理它们。首先,我将演示为实体“文章”和“供应商”工作的方法。
实体类:
@Entity
public class Article {
@Id
private String materialID;
@Column(nullable = false)
private String shortText; }
JpaRepository的实体:
@Repository
public interface IArticleRepository extends JpaRepository<Article, String>
{
List<Article> findByShortTextLike(String shortText); //just another search method
}
服务提供交易用户:
@Service
public class ArticleService implements IArticleService {
@Autowired
private IArticleRepository articleRepository;
@Override
@Transactional(readOnly = true)
public Article getArticleByID(String id) {
return this.articleRepository.findOne(id);
}
@Override
@Transactional
public Article createArticle(String id, String shortText) {
Article article = new Article();
article.setMaterialID(id);
article.setShortText(shortText);
this.articleRepository.save(article);
return article;
}
不幸的是,这个系统似乎不能正常工作为“采购”实体。 我已经阅读了关于复合主键挑战并写了这个实体类。
@Entity
@Table
public class Procurement implements Serializable {
private static final long serialVersionUID = 4976268749443066505L;
@EmbeddedId
private ProcId pk;
嵌入ID的类看起来像这样。
@Embeddable
public class ProcId implements Serializable {
private String materialID;
private int supplierID;
}
实体和id类是否正确?有没有人有想法如何更改存储库/服务以使用复合主键?
没有,PK不正确实施。为什么不做更简单,正确,更高效的事情:为采购实体使用单列自动生成的主键,就像其他两个主键一样? – 2013-04-06 11:13:08
如果我这样做,是否仍然可以在Procurement表中高效地搜索materialID和supplierID? – PWillms 2013-04-06 11:30:43
为什么不呢?使用简单的JPQL查询,并确保在[materialID,supplierID]上有一个数据库索引。 – 2013-04-06 11:38:31