Ich möchte einem Rezept eine Kategorie zuweisen. Wenn ich dem Rezept eine zweite Kategorie mit dem gleichen Namen zuteile, führt es eine andere Einfügung in die Datenbank durch, die abbricht (Abbruch aufgrund von Constraint-Verletzung (UNIQUE Constraint fehlgeschlagen: category.name) - das ist in Ordnung). Ich möchte diesen Eintrag wiederverwenden und an das Rezept anhängen. Gibt es eine JPA-Möglichkeit, dies "automatisch" zu tun oder muss ich damit umgehen? Sollte ich in der setCategory-Methode nach einer gleichnamigen Kategorie suchen und diese verwenden, wenn vorhanden? Gibt es ein Muster?JPA Eindeutige Einträge
@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;
}
}
Beispiel:
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);
Ausführung dieses zweimal in der einzigartigen constraint ergibt fehlgeschlagen: category.name. Das ist in Ordnung, da ich nicht mehrere Kategorien mit demselben Namen möchte. Die Datenbank hat dies durchgesetzt, aber ich suche nach der Lösung, dies auch auf der Java-Sprache zu erzwingen. Die 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
);
Was Sie brauchen, ist eine Sammlung von Kategorien und ordnen Sie sie mit Hibernate Collection Mapping-Regeln. Siehe [dies] (https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html). Mit anderen Worten, einige Bits müssen von Ihnen selbst erledigt werden. – ha9u63ar
und "die zweite Kategorie mit dem gleichen Namen" kommt von wo? von Grund auf neu erstellt? (In welchem Fall ist ein anderes Objekt), abgerufen von find()/query()? In diesem Fall repräsentiert, was bereits in der Datenbank ist. Es sei denn, Sie definieren Ihre Ausdauer, die niemand kennen kann. FWIW Eine JPA "Unique Constraint" wird nur in der DB erzwungen ... in DDL –