Zdravím,
dělám aplikci pro evidenci příspěvků (článků), která zároveň umožnuje
vkládat ke každému příspěvku (článku) X komentářů. Na SQL serveru jsou dvě
tabulky CLANKY a KOMENTARE, které jsou spolu provázané pře IDCLANEK. Mám
dva dotazy:
1. Pokud mám vytvořenu instanci clanky třídy Clanky a přidám nový komentář
clanek.getKomentareCollection().add(newKomentar) jak zajistit to, aby se
naplnilo automaticky i idclanek v takto vloženém komentáři?
2. komentář vkládám přes JSF kdy se poprvé volá clanek(), která vytvoří
novou instanci newKomentar třídy Komentare a následně se ukládá přes
ulozKomentar(), kde se pak vrací zpět na tu samou stránku. problém je, že
to do databáze ukládá jakoby o krok zpět tj. při uložení druhého komentáře
se uloží první. Pokud bych místo em.flush() použil em.persist(clanek), tak
to vyhodí vyjímku, že nemůže uložit detachnutý objekt.
Doufám, že jsem to napsal srozumitelně. Toto je moje první použití JPA na
relace, tak se předem omlouvám za možná stupidní otázky
Díky
Pavel
public class Clanky implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "idclanek", nullable = false)
@GeneratedValue(strategy=IDENTITY)
private Integer idclanek;
@Column(name = "datum", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date datum;
@Column(name = "nadpis", nullable = false)
private String nadpis;
@Lob
@Column(name = "text", nullable = false)
private String text;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idclanek")
private List<Komentare> komentareCollection;
public class Komentare implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "idkomentar", nullable = false)
@GeneratedValue(strategy=IDENTITY)
private Integer idkomentar;
@Column(name = "datum", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date datum;
@Column(name = "jmeno", nullable = false)
private String jmeno;
@Lob
@Column(name = "text", nullable = false)
private String text;
@JoinColumn(name = "idclanek", referencedColumnName = "idclanek")
@ManyToOne(fetch=FetchType.EAGER)
private Clanky idclanek;
public String clanek() {
clanek = (Clanky) dataTable.getRowData();
newKomentar = new Komentare();
newKomentar.setIdclanek(clanek);
return "success";
}
public String ulozKomentar() {
em = emf.createEntityManager();
em.getTransaction().begin();
em.merge(clanek);
clanek.getKomentareCollection().add(newKomentar);
em.flush();
em.getTransaction().commit();
em.close();
newKomentar = new Komentare();
newKomentar.setIdclanek(clanek);
return "";