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;
@Overrideif 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,