Hi,
Im a newbie in hibernate and id like to implement a simple struts2+hibernate crud. I have a pb with the saveorUpdate() method. When I try to update the parent with new element in the child Set it reinit the child Set before updating.
I am a little bit lost, could u explain to me what's wrong in my code?
I have two classes with an onetomany association.
the parent is:
@Entity @Table(name="MATRIX") public class Matrix { private Long id; private String name; private Columndef cldef = new Columndef(); private Set<Columndef> values = new HashSet<Columndef>(0); @Id @GeneratedValue @Column(name="MATRIX_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="NAME") public String getName() { return name; } public void setName(String val) { name = val; } @OneToOne(cascade = CascadeType.ALL) public Columndef getCldef() { return cldef; } public void setCldef(Columndef cl) { cldef = cl; } @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "MATRIX_COLUMNDEF", joinColumns = { @JoinColumn(name = "MATRIX_ID") }, inverseJoinColumns = { @JoinColumn(name = "COLUMNDEF_ID") }) public Set<Columndef> getValues() { return values; } public void setValues(Set<Columndef> lst) { if (lst != null) { if (lst.size() > 0) values = lst; } } public void addValue(Columndef cl) { values.add(cl); } }
and the child is:
import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinTable; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table;
@Entity @Table(name="MATRIX") public class Matrix { private Long id; private String name; private Columndef cldef = new Columndef(); private Set<Columndef> values = new HashSet<Columndef>(0); @Id @GeneratedValue @Column(name="MATRIX_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="NAME") public String getName() { return name; } public void setName(String val) { name = val; } @OneToOne(cascade = CascadeType.ALL) public Columndef getCldef() { return cldef; } public void setCldef(Columndef cl) { cldef = cl; } @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "MATRIX_COLUMNDEF", joinColumns = { @JoinColumn(name = "MATRIX_ID") }, inverseJoinColumns = { @JoinColumn(name = "COLUMNDEF_ID") }) public Set<Columndef> getValues() { return values; } public void setValues(Set<Columndef> lst) { if (lst != null) { if (lst.size() > 0) values = lst; } } public void addValue(Columndef cl) { values.add(cl); } }
My action is:
public class MatrixAction extends ActionSupport implements ModelDriven<Matrix> { /** * */ private static final long serialVersionUID = -2662966220408285700L;
private Matrix cl = new Matrix(); private List<Matrix> clList = new ArrayList<Matrix>(); private MatrixDAO clDAO = new MatrixDAOImpl(); private Set<Columndef> lst = new HashSet<Columndef>(); private List<Columndef> lst2 = new ArrayList<Columndef>(); @Override public Matrix getModel() { return cl; } /** * To save or update cl. * @return String */ public String saveOrUpdate() { clDAO.saveOrUpdateMatrix(cl); return SUCCESS; }
and my DAO is:
public class MatrixDAOImpl implements MatrixDAO { @SessionTarget Session session; @TransactionTarget Transaction transaction;
@Override public void saveOrUpdateMatrix(Matrix cl) { try { session.saveOrUpdate(cl); } catch (Exception e) { transaction.rollback(); e.printStackTrace(); } } If I add a new element to the cl.values Set I can check that the cl.values is correct before the saveOrUpdate() method. But unfortunately it doesn' save the updated cl.values Set in DB.
thks in advance,
bruno
|