我想將一個類別分配給配方。如果我將另一個具有相同名稱的類別分配給配方,則會向數據庫插入另一箇中止(由於違反約束而中止(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;
}
}
例子:
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);
執行此兩次導致UNIQUE約束失敗:category.name。這很好,因爲我不想要多個具有相同名稱的類別。數據庫強制執行此操作,但我正在尋找soltuion以在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
和「第二類同名」來自哪裏?從頭開始創建? (在這種情況下是不同的對象),由find()/ query()檢索?在這種情況下代表數據庫中已有的內容。除非你定義你的持久性,沒有人可以知道。 FWIW JPA「唯一約束」在DB中僅在DDL中執行 –