> 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?
nevim jak v JPA, ael v Hibernatu jeste pridejte
newKomentar.setClanek(clanek)
a melo by to fakcit.
> 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.
Moc tomu nerozumim...
> 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 "";
--
S pozdravem Roman "Dagi" Pichlik
/* http://www.sweb.cz/pichlik/ Blog pro kodery */