2013-04-06 48 views
3

我设计了以下数据库表:JPA存储库/ Service设计与复合主键

  1. “制品”与“materialID”作为主键。
  2. “supplier”以“supplierID”作为主键。
  3. 将“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类是否正确?有没有人有想法如何更改存储库/服务以使用复合主键?

+0

没有,PK不正确实施。为什么不做更简单,正确,更高效的事情:为采购实体使用单列自动生成的主键,就像其他两个主键一样? – 2013-04-06 11:13:08

+0

如果我这样做,是否仍然可以在Procurement表中高效地搜索materialID和supplierID? – PWillms 2013-04-06 11:30:43

+0

为什么不呢?使用简单的JPQL查询,并确保在[materialID,supplierID]上有一个数据库索引。 – 2013-04-06 11:38:31

回答

1

ProcId应该这样定义:

@Embeddable 
public class ProcId implements Serializable { 
    @ManyToOne(optional = false) 
    private Article article; 
    @ManyToOne(optional = false) 
    private Supplier supplier; 
} 
+0

终于得到了我的解决方案上面的工作,但我会考虑你的建议。我还找到了关于该主题的“知识数据库”:http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced – PWillms 2013-04-06 16:26:17