在hibernate中我想同一个jsp页面,同一个按钮,如何实现如果数据库没有就insert,如果数据库有就update.
========LineDetail.hbm.xml===========
<hibernate-mapping>
    <class name="fatcat.db.LineDetail" table="line_detail">
        <id name="line_bh" type="java.lang.String">
            <column name="line_bh" length="30" />
            <generator class="assigned" />
        </id>
        <property name="content"   type="java.lang.String"  column="content" />
        <one-to-one name="line" class="fatcat.db.Line" property-ref="LineDetail" cascade="all"/> 
    </class>
</hibernate-mapping>
========Line.hbm.xml===========
<hibernate-mapping>
   <class name="fatcat.db.Line" table="line" >
      <id name="id" type="java.lang.Integer">
          <column name="id" />
          <generator class="native" />
      </id>
     <property name="lineName" type="java.lang.String"    column="line_name"   length="250"/>
     <many-to-one name="LineDetail"  class="fatcat.db.LineDetail" column="bh"  cascade="all" unique="true" /> 
   </class>
</hibernate-mapping>
========Line.java==== 
public class Line { 
private LineDetail LineDetail; 
private Integer id; 
private String bh; 
private String lineName; public Line() {} public Integer getId() {return this.id;} 
public void setId(Integer id) {this.id = id;} public String getBh() {return this.bh;} 
public void setBh(String bh) {this.bh = bh;} public String getLineName() {return this.lineName;} 
public void setLineName(String lineName) {this.lineName = lineName;} public LineDetail getLineDetail() {return LineDetail;} 
public void setLineDetail(LineDetail lineDetail) {this.LineDetail = lineDetail;} 

====LineDetail.java==== 
public class LineDetail { 
private String line_bh; 
private String content; 
private Line line; public Line getLine() {return line;} 
public void setLine(Line line) {this.line = line;} public LineDetail() {} 
public LineDetail(String content) {this.content = content;} public String getline_bh() {return this.line_bh;} 
public void setline_bh(String line_bh) {this.line_bh = line_bh;} public String getContent() {return this.content;} 
public void setContent(String content) {this.content = content;} 
//实现了保存,但是如何让这段代码实现,如何数据库没有就insert,如果书库有就update
 Line line = new Line();
line.setBh("123456789");
line.setLineName("海南旅游线路");
LineDetail line_detail = new LineDetail();
line_detail.setContent("asdfasfasfasfdasfafwef");
line_detail.setline_bh("123456789");
System.out.println("line_bh:="+line_detail.getline_bh());line.setLineDetail(line_detail);
line_detail.setLine(line);this.line_service.save_all(line_detail);

解决方案 »

  1.   

    session有个saveOrUpdate方法,用这个就可以啦
      

  2.   

    Hibernate有个自增长的id,如果增加这个对象的id是0,如果修改这个对象的id肯定是别的。可以通过判断这个对象的id是否为0来进行增加记录还是跟新
      

  3.   

    我看了,如果按照你这样来的话,就得有有行为动作判断,当然是可以啦,但我想hibernate一定会提供这样的方法的,自动识别的,只要配置正确,其实用了这么多年的delphi,人家的post,就是简单,不管新增更新,都是一个post,超级简单如果hibernate都实现不了这个功能的话,那java也太次了。
      

  4.   

    如果id存在的话  调用SaveOrUpdate应该没问题吧
      

  5.   

    不知道你是什么错啊,SaveOrUpdate如果id不存在就进行增加,存在的话就进行修改
      

  6.   

    SaveOrUpdate(line)
    如果
    Line line=new Line();
    是insert
    Line line=new Line();
    line.setId(2);
    是update
      

  7.   


    这怎么能说是JAVA次呢?
      面向方法某些时候是简单,但结构上和面向对象没法比
      

  8.   


    循环比较 太麻烦,直接用你的数据中的一个unique并且not-null的字段来查数据库,如果得到的对象是null,就用insert,否则就是update
      

  9.   

    saveOrUpdate()让系统自动判断他是insert还是update
      

  10.   

    问题在于你没有设置ID,所以就保存了,而不会判断是不是有存在.saveOrUpdate()要先有ID,才有判断.
    line.setBh("123456789"); 
    line.setLineName("海南旅游线路");
    //line.setId(id); 仅凭这一个问题说JAVA太次>>>.... LZ是不是搞程序的.或者你可以先发一条SQL查询下有没有"海南旅游线路"这个名字,然后再INSERT.
    HIBERNATE也不可能这么智能的.必然是先查询才知道有没有,PROXY先加载ID,而不是NAME,所以你没有 设置ID,不可能实现的.但像上面设置ID似乎也不行.会出现重复ID,插入错误.通常外面传进来不是这种形式.会有ID的.
    所以先 
    Line l=searchByName(name);  这个方法查询是否存在name的Line对象.
    然后 if(l!=null){
    l.setBh();
    l.setLineName();
    }else{
    l=new Line();
    l.setBh();
    l.setLineName();
    }