4

次のデータベース テーブルを設計しました。

  1. 「materialID」を主キーとする「article」。
  2. 「supplierID」を主キーとする「supplier」。
  3. "materialID" と "supplierID" を複合主キーとして持つ "調達" (テーブル 1 と 2 への外部キーの関係を含む)。

今、私はJPAを使用してSpringでそれらを処理したいと考えています. 最初に、エンティティ「article」と「supplier」に対して機能するアプローチを示します。

エンティティ クラス:

@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 クラスは正しいですか? 複合主キーを操作するためにリポジトリ/サービスを変更する方法を知っている人はいますか?

4

1 に答える 1

1

次のProcIdように定義する必要があります。

@Embeddable
public class ProcId implements Serializable {
    @ManyToOne(optional = false)
    private Article article;
    @ManyToOne(optional = false)
    private Supplier supplier;
}
于 2013-04-06T11:34:09.503 に答える