レシピにカテゴリを割り当てたいと思います。同じ名前の2番目のカテゴリをレシピに割り当てると、データベースに別のレコードが挿入されます(制約違反のために中断します(UNIQUE制約に失敗しました:category.name) - これは実際には問題ありません)。私はこのエントリーを再利用してレシピに添付したい。これを「自動的に」行うJPAの方法はありますか、これを処理する必要はありますか? setCategoryメソッドで同じ名前のカテゴリを検索し、存在する場合はこれを使用する必要がありますか?パターンはありますか?JPA一意のエントリ
@Entity
public class Recipe {
private Integer id;
private Category category;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "category_id", referencedColumnName = "id")
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
@Entity
public class Category {
private Integer id;
private String name;
private List<Recipe> recipes;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Basic
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(mappedBy = "category", cascade = {CascadeType.ALL})
public List<Recipe> getRecipes() {
return recipes;
}
public void setRecipes(List<Recipe> recipes) {
this.recipes = recipes;
}
}
例:UNIQUE制約では、この二回の結果を実行する
Category category = new Category();
category.setName("Test Category");
cookbookDAO.add(cookbook);
Recipe recipe = new Recipe();
recipe.setTitle("Test Recipe");
recipe.setCategory(category);
recipeDAO.add(recipe);
に失敗しました:category.nameを。私は同じ名前の複数のカテゴリを必要としないので、これは問題ありません。データベースがこれを強制しましたが、私はこれをjava言語レベルでも強制するための解決策を探しています。 DDL:私たちは、このマッピングは、単純な言語で翻訳した場合
CREATE TABLE "recipe"
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
category_id INTEGER,
FOREIGN KEY (category_id) REFERENCES category(id)
);
CREATE TABLE "category"
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
`name` VARCHAR,
UNIQUE(`name`) ON CONFLICT ABORT
);
必要なのは、カテゴリのコレクションで、Hibernateのコレクションマッピングルールを使用してマッピングします。 [this](https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html)を参照してください。言い換えれば、あなた自身で行う必要があるビットがあります。 – ha9u63ar
「同じ名前の2番目のカテゴリ」はどこから来ますか?スクラッチから作成? (その場合は別のオブジェクトです)、find()/ query()で取得しますか?この場合は、すでにデータベース内にあるものを表します。あなたが永続性を定義しない限り、誰も知ることができません。 FWIW JPAの「一意制約」はDDL内のDBのみに適用されます –