【问题标题】:JPA Repository / Service design with composite primary keys具有复合主键的 JPA 存储库/服务设计
【发布时间】:2013-04-06 11:00:51
【问题描述】:

我设计了以下数据库表:

  1. 以“materialID”为主键的“article”。
  2. 以“supplierID”为主键的“supplier”。
  3. 以“materialID”和“supplierID”作为复合主键的“采购”(包括与表 1 和表 2 的外键关系)。

现在我想在 Spring 中使用 JPA 处理它们。首先,我将演示适用于实体“文章”和“供应商”的方法。

实体类:

@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;
}

entity 和 id 类是否正确?有谁知道如何更改存储库/服务以使用复合主键?

【问题讨论】:

  • 不,PK 没有正确实现。你为什么不做更简单、正确和更有效的事情:为采购实体使用单列、自动生成的主键,就像其他两个一样?
  • 如果我这样做,是否仍然可以有效地在采购表中搜索材料 ID 和供应商 ID?
  • 为什么不呢?使用简单的 JPQL 查询,并确保在 [materialID, supplierID] 上有一个数据库索引。

标签: java spring jpa entity-relationship composite-primary-key


【解决方案1】:

您的ProcId 应该这样定义:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 2018-02-02
  • 2013-03-19
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多