你把用户对象改为用户的ID标识就行例如 public class User { private int id; }public class Order { private int id; pirvate int userId; //虚拟外键 }表结构不用改 就改变一个配置文件 将 <many-to-one name="user"/> 改成 <property name="userId" column="原始表的外键字段"/>最后要记住把原始表的外键约束一定要删除! alter table 表明 drop 约束名;
可以把定单-用户 many-to-one中加上lazy=true试试,或cascade=none
前提是你不能用order.getUser()来取userId了。若要用,只能加个字段了
试试用hql解决。你的订单pojo需要有包含全字段的构造器,用户pojo需要有仅包含id的构造器,hql这样写 select new Order(o.字段A,o.字段B,...,new Customer(o.customer.id)) from Order o 如果你Order关联的Customer是懒加载的,这样因该不会空指针了。
就不用查用户了。它从数据库中读出来订单的时候 如果,没有用户就会它就直接报异常了。我不止是这样的一两个实体要这样。要改动会改很多地方。开始设计就没有设计好。我也没有办法啊…… 狂晕的……
你把用户对象改为用户的ID标识就行例如
public class User {
private int id;
}public class Order {
private int id; pirvate int userId; //虚拟外键
}表结构不用改 就改变一个配置文件 将
<many-to-one name="user"/>
改成
<property name="userId" column="原始表的外键字段"/>最后要记住把原始表的外键约束一定要删除!
alter table 表明 drop 约束名;
many-to-one中加上lazy=true试试,或cascade=none
select new Order(o.字段A,o.字段B,...,new Customer(o.customer.id)) from Order o
如果你Order关联的Customer是懒加载的,这样因该不会空指针了。
删用户不删订单>>不要做用户到订单的级联删除,即cascadeType中不要包含delete或是all。
删掉用户后订单报空>>因为你订单加载的时候会去加载它所对应的用户对象,但是你已经删除了,但让会报错。所以,当你删除用户的时候,还要做一步关键的操作,将它对应的订单中的用户全部拿掉。所以这还需要你订单中用户id是可空的。
明白没?
错是从数据库报出来的,在hibernate操作数据库的时候就报错来了。还由不得你去判断呢!!
如果,这样的话,save的时候会报session close!