conversation???
constantin.cash Nov 5, 2007 6:25 AMInstance of User will be saved twice,
service:
@Stateful @Name("inseract") public class InserAct implements InserActI{ @Logger private Log log; @In private FacesMessages facesMessages; @In private EntityManager entityManager; // @In private Context sessionContext; @In(required=false) Artikel artikel; @In private Identity identity; private Kategorie kat; private Kategorie ukat; private List<Kategorie> ukats; private byte[] data; private String contentType; private String fileName; private String title; private int size; public String weiter(){ return "/fupload"; } @Remove @Destroy public void remove(){ } //@End public String upload() { Img img = new Img(); img.setEdata(data); img.setEtype(contentType); img.setEsize(size); User usr = null; try{ usr = (User) entityManager.createQuery("select u from User as u where u.email = :email") .setParameter("email",identity.getUsername()) .getSingleResult(); artikel.getImgs().add(img); img.setArt(artikel); artikel.setUsr(usr); artikel.setKat(kat); //entityManager.merge(artikel); usr.getArts().add(artikel); artikel = null; entityManager.merge(usr); usr =null; return "/upokay"; }catch(Exception ex){ log.error(ex); return null; } }
view:
<h:form> <s:validateAll> <table width="800px" cellspacing="3" cellpadding="3"> <tr style="margin:0px;padding:0px 0px"> <td style="margin:0px;padding:0px 0px">Titel:</td> <td valign="top" class="star"> <h:inputText id="tit" styleClass="txt" size="30" maxlength="100" value="#{artikel.titel}" required="true"/> * <h:message for="tit" styleClass="errors"/> </td> </tr> <tr> <td> Kategorie:</td> <td valign="top" class="star"> <a4j:region id="rgs" renderRegionOnly="false"> <h:selectOneMenu value="#{inseract.kat}" > <s:selectItems value="#{sservice.katLIST}" required="true" var="kat" label="#{messages[kat.rkey]}" noSelectionLabel="Bitte wählen..."/> <a4j:support event="onchange" reRender="ukats" > <s:conversationPropagation type="join" /> </a4j:support> </h:selectOneMenu> <h:message for="her" styleClass="errors"/> </a4j:region> * </td> </tr> <!-- <tr> <td> Unterkategorie:</td> <td valign="top" class="star"> <s:span id="ukats"> <h:selectOneMenu id="rgs1" required="true" value="#{inseract.ukat}" > <s:selectItems value="#{inseract.ukats}" var="kat" label="#{messages[kat.rkey]}" noSelectionLabel="Bitte wählen..."/> </h:selectOneMenu> <h:message for="rgs1" styleClass="errors"/> </s:span> * </td> </tr> --> <tr> <td> Hersteller:</td> <td valign="top" class="star"> <h:inputText id="her" styleClass="txt" size="30" maxlength="100" value="#{artikel.hersteller}" required="true"/> * <h:message for="her" styleClass="errors"/> </td> </tr> <tr> <td valign="top" >Model: </td> <td valign="top" class="star"> <h:inputText id="art" styleClass="txt" size="30" maxlength="100" value="#{artikel.model}" required="true"/> * <h:message for="art" styleClass="errors"/> </td> </tr> <tr> ... <tr> <td colspan="2" align="left"> <p> <h:commandButton styleClass="button" value="weiter" action="#{inseract.weiter()}" reRender="frm,msg" /></p></td> </tr>
model:
@Entity @Name("usr") @Table(name="users") public class User implements java.io.Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @NotNull private int anrede; @NotNull private String firma; private String str; private String plz; private String ort; @Email @NotNull private String email; @NotNull @Length(min=6, max=30) private String passwort; @OneToMany(mappedBy="usr",cascade = CascadeType.ALL) private List<Artikel> arts;
@Entity @Name("artikel") @Table(name="artikel") public class Artikel { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String hersteller; private String typ; private String model; private double preis; private String titel; private double gewicht; @NotNull @ManyToOne private User usr; @NotNull @ManyToOne private Kategorie kat; @Length(max=1000) private String beschreibung; private int bs; private String standort; private boolean activ; @OneToMany(mappedBy="art",cascade = CascadeType.ALL) private List<Img> imgs;
@Entity @Name("image") @Table(name="images") public class Img { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Lob @Basic(fetch=FetchType.LAZY) private byte[] edata; @NotNull @ManyToOne private Artikel art; private String etype; private int esize; @Override
if change the lines in the service to
public String upload() { Img img = new Img(); img.setEdata(data); img.setEtype(contentType); img.setEsize(size); User usr = null; try{ usr = (User) entityManager.createQuery("select u from User as u where u.email = :email") .setParameter("email",identity.getUsername()) .getSingleResult(); artikel.getImgs().add(img); img.setArt(artikel); artikel.setUsr(usr); artikel.setKat(kat); entityManager.merge(artikel); //usr.getArts().add(artikel); artikel = null; //entityManager.merge(usr); //usr =null; return "/upokay"; }catch(Exception ex){ log.error(ex); return null; } }
it does work correctly, if i make away artikel=null, the instance of artiekel and img will saved twice,