请教高手,我有两个对象是一对多和多对一的关系,其中多对一(Wbsitem)表里面有外键WBS_ID引用一对多方(WBS表)
我在JUNIT里面写了个测试方法保存WBS对象时级联保存WBSITEM对象,但总是不成功。网上有的说是把javax.pesistence.cascade、cascadetype换成hibernate.annotation.cascade、cascadetype但还是不行!控制台发出的操作语句为插入WBS表如INSRT INTO WBS(....) VALUE(...)  WBSITEM表UPDATE WBSITEM SET ... WHERE..这是为什么呢,
下面是我的代码
@Entity
@Table(name="t_Wbs")
public class Wbs implements java.io.Serializable { /**
 * 
 */
@Transient
private static final long serialVersionUID = 1L;
// Fields
@Id
@GeneratedValue(generator = "c-assigned")     
@GenericGenerator(name = "c-assigned", strategy = "assigned")     
@Column(name="wbsid")
private String wbsid;

@OneToOne()
@Cascade(value=CascadeType.SAVE_UPDATE)
@JoinColumn(name="prjid",referencedColumnName="prjid",unique=true)
private Projects projects;

@Column(name="layer")
private int layer;

@Column(name="rootitemid")
private String rootitemid;

@Column(name="creator")
private String creator;

@OneToMany(fetch=FetchType.EAGER,targetEntity=Wbsitem.class,mappedBy="wbs",cascade=javax.persistence.CascadeType.ALL)
@Cascade(value={CascadeType.ALL})
@JoinColumn(name="wbs_id")
private Set<Wbsitem> wbsitems;@Entity
@Table(name="t_Wbsitem")
public class Wbsitem implements java.io.Serializable { /**
 * 
 */
private static final long serialVersionUID = 1L; // Fields
@Id
@GeneratedValue(generator = "c-assigned")     
@GenericGenerator(name = "c-assigned", strategy = "assigned")  
@Column(name="wbsitemid")
private String wbsitemid;

@ManyToOne
//@Cascade(value=CascadeType.ALL)
@JoinColumn(name="wbs_id" ,insertable=true,updatable=false)
private Wbs wbs;

@Column(name="title")
private String title;

@Column(name="description")
private String description;

@OneToMany(targetEntity=Wbsitemhierarchy.class,mappedBy="wbsitem")
@Cascade(value=CascadeType.ALL)
//@OnDelete(action=OnDeleteAction.CASCADE)
private Set<Wbsitemhierarchy> wbsitemhierarchies;
测试方法 @Test
@Rollback(false)
public void testManyToOne() 
{
Wbs wbs=new Wbs();
try {

wbs.setCreator("me");
wbs.setWbsid("wbs001");
wbs.setLayer(4); } catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(Exception ex)
{
ex.printStackTrace();
}
Set items=new HashSet();

Wbsitem item =null;
for(int i=0;i<5;i++)
{
item=new Wbsitem();
item.setWbs(wbs);
item.setWbsitemid("wi00"+String.valueOf(i));
item.setTitile(String.valueOf(i));
items.add(item);

//this.entityDao.save(item);
}
wbs.setWbsitems(items);
this.entityDao.save(wbs);
}

解决方案 »

  1.   

    一表的POJO映射文件中的set 设置cascade="all",就可以级联保存了。OnePojo(一表) ManyPojo(多表)
    ManyPojo mp = new ManyPojo (); mp.setName("aa");
    OnePojo op = new OnePojo(); op.setName("bb");
    mp.setOnePojo(op);   
    Set set = new HashSet(); set.add(mp);
    op.setManyPojo(set);//级联保存多个表
    oneDao.save(op);
    这样就级联进去了。。接分
      

  2.   

    你没有指定关系的管理方,即mappedby
      

  3.   

    当选择assigned生成器时,除非有一个version或timestamp属性,或者你定义了 Interceptor.isUnsaved(),否则需要让Hiberante使用 unsaved-value="undefined",强制Hibernatet查询数据库来确定一个实例是瞬时的(transient) 还是脱管的(detached)。