指定insert,update属性表明这个是虚拟字段(或当作它是),Hibernate不会对它进行插入和更新操作。通常用于many-to-one中已存在这个字段对应的对象(一般是ID),所以不能更新两次。象你的:
<class name="com.pelfu.saleadmin.pojo.SellOrder" table="sellOrder" schema="crm" catalog="crm">
映射文件中的:
<property name="clientId" type="integer" insert="false update="false">
<column name="clientId" />
</property>
但你的one-to-many这这些,不用设它们为false,所以把:
<property name="clientId" type="java.lang.Integer" insert="false" update="false">
改为:
<property name="clientId" type="java.lang.Integer">
<class name="com.pelfu.saleadmin.pojo.SellOrder" table="sellOrder" schema="crm" catalog="crm">
映射文件中的:
<property name="clientId" type="integer" insert="false update="false">
<column name="clientId" />
</property>
但你的one-to-many这这些,不用设它们为false,所以把:
<property name="clientId" type="java.lang.Integer" insert="false" update="false">
改为:
<property name="clientId" type="java.lang.Integer">
解决方案 »
- 什么是java
- Servlet传值回来不正确,方法没错。
- struts在什么情况下会跳转到空也面上去啊?一片空白。不知道什么原因
- 请问,用Axis2能不能建立纯粹客户端及Axis2的使用
- 关于读文件然后写入数据库的效率问题
- tomcat5.5/6.0 启动异常问题
- EJB3.0 有那些工具可以支持开发
- 求过来人推荐学习J2EE入门到进阶的经典书籍的顺序列表。。多谢高人不吝赐教
- hibernate 异常a different object with the same identifier value was already associated with the session:
- servlet问题调用EJB
- 这个怎么解析
- java开源了?
指定insert,update属性为false表明这个是虚拟字段(或当作它是),Hibernate不会对它进行插入和更新操作。
改为:
<property name="clientId" type="java.lang.Integer">
则系统报错提示必须设置成insert="false" update="false"
我估计是其他地方配置不当导致必须这样配置这个clientId字段
<?xml ligengyin233version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.pelfu.customeradmin.pojo.ClientSetting" table="clientSetting" schema="crm" catalog="crm">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="clientId" type="java.lang.Integer" update="true" insert="true">
<column name="clientId" />
</property>
<property name="companyName" type="java.lang.String">
<column name="companyName" length="100" />
</property>
................
<set name="sellOrders" inverse="true" cascade="all" fetch="select" lazy="true">
<key property-ref="clientId" update="false">
<column name="clientId"/>
</key>
<one-to-many class="com.pelfu.saleadmin.pojo.SellOrder" />
</set>
</class>
</hibernate-mapping><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.pelfu.saleadmin.pojo.SellOrder" table="sellOrder" schema="crm" catalog="crm">
<id name="id" type="integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="orderName" type="string">
<column name="orderName" length="100" />
</property>
<property name="billNo" type="string">
<column name="billNo" length="20" />
</property>
<property name="clientName" type="string">
<column name="clientName" length="100" />
</property>
<property name="clientId" type="integer">
<column name="clientId" />
</property>
..................
<many-to-one name="clientSetting" class="com.pelfu.customeradmin.pojo.ClientSetting" cascade="none" fetch="select" property-ref="clientId"
update="false" insert="false">
<column name="clientId"/> </many-to-one>
</class>
</hibernate-mapping>
<column name="clientId" />
</many-to-one>
<property name="clientId" type="integer" insert="false update="false">
<column name="clientId" />
</property>
这两个属性都映射了同一个clientId, 那么必须有一个属性是 insert="false update="false"
否则生成的SQL 变成 insert into sellOrder(...,clientId,clientId,...), value(...)
会有两个clientID, 肯定是不合法的.
现在的问题是哪个属性设置为 insert="false update="false"
(1) 如果设置 clientId 为 insert="false update="false"
那么, 你要写clientId, 必须如下:
SellOrder order= new SellOrder();
ClientSetting client = new ClientSetting();
client.setClientId(clientid);
//如果client是数据库中已经存在的记录, 那么
// ClientSetting client = session.load(ClientSetting.calss,clientid);
order.setClientSetting(client);
session.save(order);
(2) 如果设置 cientSetting 属性为 insert="false update="false"
SellOrder order= new SellOrder();
order.setClientId(clientid);
session.save(order);
同时要设置lazy的属性为false,这样的话,你就可以很方便的从一个对象导航到另外一个对象
而不需要什么连接查询同时,你在插入操作的时候
需要先load一下相关的对象,建立他们之间的关联
如果赞同我的做法
qq :549761
commit mode.
我想问一下,你的前台要接收的内容是什么,我曾经做过一个牙医管理系统,它也涉及到了联合的问题,我要做的内容是在前台接收了一个医生的姓名,然后我要往另外的一个表里面去插入,但是在另外的一个表里和这个表没有任何的关系,插入的还是这个表的id,我只好在重新写了一个hql语句,去访问医生姓名的表,我通过得到的性名来查询它的id,然后将id插入到了我需要插入的表中。
这是我的代码 action:package action;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;import com.*;import bean.*;import java.io.IOException;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
import filter.NoteFilter;
import form.StockOutForm;public class StockOutAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
NoteFilter filter=new NoteFilter();//是我写的一个过滤器
List list=null;
List list1=new ArrayList();
StockOutput stockOutput=new StockOutput();
GoodsName goodsName=new GoodsName();
OrderDbo dbo=new OrderDbo();
StringBuffer hql4=new StringBuffer("from StockOutput s left join fetch s.goodsName where 1=1");
String check1=request.getParameter("checkbox1");
String check2=request.getParameter("checkbox2");
String check3=request.getParameter("checkbox3");
String check4=request.getParameter("checkbox4");
System.out.println("check1============="+check1);
System.out.println("check2============="+check2);
System.out.println("check3============="+check3);
System.out.println("check4============="+check4);
if(check1!= null){
String bdate=request.getParameter("bdate");
System.out.println("bdate============="+bdate);
String edate=request.getParameter("edate"); hql4=hql4.append(" and s.outputDate between'");
hql4=hql4.append(bdate);
hql4=hql4.append(" 'and '");
hql4=hql4.append(edate);
hql4=hql4.append(" '");
}
if(check2!=null){
String name=request.getParameter("pname");
System.out.println(name);
name=NoteFilter.filter(name.trim());
System.out.println("check2");
stockOutput.setName(name);
hql4=hql4.append(" and s.name=:name");
}
if(check3!= null){
String goodsname=request.getParameter("goodsname");
goodsname=filter.filter(goodsname.trim());
//再此的hql语句是一个参数绑定的形式
goodsName.setGoodsId(dbo.getID1("from GoodsName g where g.goodsName=:goodsName",goodsname));
System.out.println("iddddd="+goodsName.getGoodsId());
stockOutput.setGoodsName(goodsName);
hql4=hql4.append(" and s.goodsName=:goodsName");
System.out.println("goodsName"+goodsname);
}
if(check4!= null){
int Id=Integer.parseInt(request.getParameter("outputId"));
System.out.println("Id="+Id);
Integer outputId=new Integer(Id);
stockOutput.setOutputId(outputId);
System.out.println("outputId"+outputId);
hql4=hql4.append(" and s.outputId=:outputId");
} System.out.println("hql4.toString()========"+hql4.toString());
list=dbo.select(stockOutput,hql4.toString());
System.out.println("list");
Iterator it=list.iterator();
System.out.println("it="+list.size());
while(it.hasNext())
{
System.out.println("w");
StockOutput stock=(StockOutput)it.next();
GoodsName goods=stock.getGoodsName();
StockOutForm f1=new StockOutForm();
f1.setOutputId(stock.getOutputId().toString());
f1.setName(stock.getName());
f1.setGoodsName(goods.getGoodsName());
f1.setLyQuantity(stock.getLyQuantity().toString());
f1.setPetailPirce(stock.getPetailPirce().toString());
f1.setRe(stock.getRe());
f1.setStoreroom(stock.getStoreroom());
f1.setOutputDate(stock.getOutputDate().toString());
list1.add(f1);
System.out.println(list1.size());
}
Iterator it1=list1.iterator();
System.out.println("it1");
request.setAttribute("it",it1);
return mapping.getInputForward();
}}
<column name="clientId"/>
</key>
试一下改为:<key property-ref="clientId">
<column name="clientId"/>
</key>你提供的你的运行代码才行,谁知道你怎操作时报错?