一个订单可能有多位乘客 所以对应1:n的关系
pojo类是这样的
public class OrderForm implements java.io.Serializable { private String ofnum;
private String linkman;
private String linkphone;
private String sex;
private String op;
private String sendaddress;
private String belongcom;
private String onote;
private Date ordertime;
private Set<Passenger> passengers=new HashSet<Passenger>();
public Set<Passenger> getPassengers() {
return passengers;
} public void setPassengers(Set<Passenger> passengers) {
this.passengers = passengers;
} public OrderForm() {
} public String getOfnum() {
return this.ofnum;
} public void setOfnum(String ofnum) {
this.ofnum = ofnum;
}//省略其他get和set方法
public Date getOrdertime() {
return this.ordertime;
} public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
} }乘客类是这样的public class Passenger implements java.io.Serializable { private Long pid;
private String pname;
private String certificatenum;
private String isgrowup;
private String pnote;
private OrderForm orderform;

private Set<Ticket> tickets=new HashSet<Ticket> (); public Set<Ticket>  getTickets() {
return tickets;
} public void setTickets(Set<Ticket>  tickets) {
this.tickets = tickets;
} public OrderForm getOrderform() {
return orderform;
} public void setOrderform(OrderForm orderform) {
this.orderform = orderform;
} public Passenger() {
} public Long getPid() {
return this.pid;
} public void setPid(Long pid) {
this.pid = pid;
}//省略其他get和set方法
public String getPnote() {
return this.pnote;
} public void setPnote(String pnote) {
this.pnote = pnote;
}}其中配置文件是这样写的
<hibernate-mapping>
    <class name="com.helphand.vo.OrderForm" table="ORDER_FORM" schema="CRM" >
        <id name="ofnum" type="java.lang.String">
            <column name="OFNUM" length="20" />
            <generator class="assigned" />
        </id>
----省略其他属性       
       <set name="passengers"
        cascade="all"
        inverse="true"
        >
        <key column="OFNUM"></key>
        <one-to-many class="com.helphand.vo.Passenger"/>
       </set>
    </class>
</hibernate-mapping>
passenger  XML
<hibernate-mapping>
    <class name="com.helphand.vo.Passenger" table="PASSENGER" schema="CRM">
        <id name="pid" type="java.lang.Long">
            <column name="PID" precision="20" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="pname" type="java.lang.String">
            <column name="PNAME" length="20" />
        </property>
        <property name="certificatenum" type="java.lang.String">
            <column name="CERTIFICATENUM" length="20" />
        </property>
        <property name="isgrowup" type="java.lang.String">
            <column name="ISGROWUP" length="2" />
        </property>
       
        <property name="pnote" type="java.lang.String">
            <column name="PNOTE" length="200" />
        </property>
         <many-to-one
         name="orderform"
         class="com.helphand.vo.OrderForm" 
         column="OFNUM"
         >
         </many-to-one>
    </class>
</hibernate-mapping>
他们之间是通过订单号码OFNUM 进行一对多的
我做测试像这样添加        OrderForm of=new OrderForm();
        Passenger pp=new Passenger();
pp.setPid(dsk.getLostMs());//这个是为创建一个唯一主键
pp.setCertificatenum("123456");
pp.setPname("maodie");
pp.setIsgrowup("1");

of.setOfnum(dsk.getNumIndex().toString());//这个是创建一个唯一主键
of.setLinkman("maodie");
of.setLinkphone("123456789");
of.setOp("oooo");
of.getPassengers().add(pp);

Transaction tx=sess.beginTransaction();
ofdao.save(sess, of);
tx.commit();
像这样添加数据的时候 订单表能正确录入数据 乘客表也能对应录入数据,但是在乘客表里的OFNUM字段 也就是他们关联的字段 总是录不进,也就是为空串,好像没设置一样。这个是什么原因呢?本人分不多 , 50分问个问题吧~ 烦呀

解决方案 »

  1.   

    另外说句,如果手工从数据库录入一组关联的数据 再进行级联删除时  也能成功
    也就是这个一对多 什么地方都实现了,只有一个地方有问题  多的那方关联的字段值没有自动被填充也就是我若在 <many-to-one/>里添加 not-null="true" 就被报错说字段是空值 而你设定的不为空 而抛出异常
      

  2.   

     <id name="ofnum" type="java.lang.String">
                <column name="OFNUM" length="20" />
                <generator class="assigned" />
            </id>
    你把这个字段换成别的字段试一下,或者单独入库一下,排除本身问题....
    我以前这样做过,不过没有问题目...
      

  3.   

    OFNUM的值在OrderForm里能正确录入哈,只是在乘客表里不能自动添加进去,我看了些一对多的例子,作为1的一放关联键是可以做主键的哈自己沉重的顶下~
    等待高手~~
    谢谢楼上~
      

  4.   

     <set name="passengers"
                   cascade="all"
                   inverse="false" //修改为false,就可以了。
                   >
                   <key column="OFNUM"></key>
                   <one-to-many class="com.helphand.vo.Passenger"/>
           </set>
      

  5.   

      of.setLinkphone("123456789");
        of.setOp("oooo");
        of.getPassengers().add(pp);
        //在你的代码中补上这一句把。
        pp.setOrderform(of); 
        Transaction tx=sess.beginTransaction();
        ofdao.save(sess, of);
        tx.commit();
    原因: 
    因为你在 set 里将 inverse="true" 也就是说。
    hibernate 会根据 Passenger 对象的状态来更新数据库
    可是你的 pp 并没有同你的 of 关联 所以 你的哪个字段会为空。
      

  6.   

    嘿嘿 ,我试了  9楼正解!!!!感谢你们 感谢我的另外个朋友 也指出了这点~inverse="true"时就把关系转交给另一方维护
    而我对数据录入的时候还是以被控端为起点录入的主从关系搞错了