一个订单可能有多位乘客 所以对应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分问个问题吧~ 烦呀
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分问个问题吧~ 烦呀
也就是这个一对多 什么地方都实现了,只有一个地方有问题 多的那方关联的字段值没有自动被填充也就是我若在 <many-to-one/>里添加 not-null="true" 就被报错说字段是空值 而你设定的不为空 而抛出异常
<column name="OFNUM" length="20" />
<generator class="assigned" />
</id>
你把这个字段换成别的字段试一下,或者单独入库一下,排除本身问题....
我以前这样做过,不过没有问题目...
等待高手~~
谢谢楼上~
cascade="all"
inverse="false" //修改为false,就可以了。
>
<key column="OFNUM"></key>
<one-to-many class="com.helphand.vo.Passenger"/>
</set>
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 关联 所以 你的哪个字段会为空。
而我对数据录入的时候还是以被控端为起点录入的主从关系搞错了