太晕了,小可刚才用annotation写了增删两个方法(如下代码),运行了之后,插入倒是可以写入数据库。但是删除的时候,却只能在数据库中删除刚才插入的满足条件的类,如果数据库中原有的数据那是无法删除的,即使它满足条件。
请问如何能让持久化类和数据库中的数据同步一下,来避免这种错误? public void Add(Object item)
 {
  Configuration cfg = new AnnotationConfiguration();
  SessionFactory sf = cfg.configure().buildSessionFactory();
  Session session = sf.openSession();
  session.beginTransaction();
  session.save(item);
  session.getTransaction().commit();
  session.close();
  sf.close();
  System.out.print("Annotation --- save complete!");
 
 }
     public void Del(int goodsId){
       Configuration cfg = new AnnotationConfiguration();
  SessionFactory sf = cfg.configure().buildSessionFactory();
  Session session = sf.openSession();
  session.beginTransaction();
  Goods goods = new Goods();
  goods.setId(new Integer(goodsId));
  session.delete(goods);
  session.getTransaction().commit();
  session.close();
  sf.close();
  System.out.print("Annotation --- save complete!");
      
     }

解决方案 »

  1.   

    楼上,没报错,就是现在如果代码是从头Create表,然后查询,那么不会有什么问题。
    但是数据库中的表总不能每次用户登录进来都create一遍吧,当用户登录的时候,是不是要读进来以前的表?
    现在的问题就是,如何根据这个以前的表来生成持久化类呢?
      

  2.   

    你先说说你hibernate是怎么用的  也就是说数据库表--数据库映射文件--java实体类这三者你分别是怎么实现的?
      

  3.   

    数据库表是用持久化类create的。实体类如下:
    @Entity
    public class Goods {
    int Id;
    String goodsName;
    Double goodsPrice;
    String goodsPic;
    String goodsDesc;
    int salerId;
    Date beginTime;
    Date endTime;
    int buyerId;
    int goodsStatus;
    User user;
    User user2;
    public Goods(int _Id){
    Id=_Id;
    }
    public Goods(){

    }
    public Goods(int _Id,String _goodsName,Double _goodsPrice,
    String _goodsDesc,String _goodsPic,Date _beginTime,
    Date _endTime
    ){
    Id = _Id;
    goodsName = _goodsName;
    goodsPrice =_goodsPrice; 
    goodsDesc =_goodsDesc;
    goodsPic = _goodsPic;
    beginTime = _beginTime;
        endTime = _endTime;

    }
    @ManyToOne
    public User getUser() {
    return user;
    }
    public void setUser(User user) {
    this.user = user;
    }
    @ManyToOne
    public User getUser2() {
    return user2;
    }
    public void setUser2(User user2) {
    this.user2 = user2;
    }
    @Id
    @GeneratedValue
    public int getId() {
    return Id;
    }
    public void setId(int Id) {
    this.Id = Id;
    }
    ...略去其它getter setter方法。
    goods xml:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>
    <class name="entity.Goods" table="GOODS1">
    <id name="Id">
    <generator class="native"></generator>
    </id>

    <property name="goodsName"></property>
    <property name="goodsPrice"></property>
    <property name="goodsDesc"></property>
    <property name="goodsPic"></property>
    <property name="beginTime"></property>
    <property name="endTime"></property>
    <property name="goodsStatus"></property>
    <many-to-one name="user" column="salerId" />
    <many-to-one name="user2" column="buyerId" />

        </class>

    </hibernate-mapping>
    Dao类:
    public class GoodsDAOImpl {
     public void Add(Object item)
     {
      Configuration cfg = new AnnotationConfiguration();
      SessionFactory sf = cfg.configure().buildSessionFactory();
      Session session = sf.openSession();
      session.beginTransaction();
      session.save(item);
      session.getTransaction().commit();
      session.close();
      sf.close();
      System.out.print("Annotation --- save complete!");
     
     }
    主函数:
     Goods item = new Goods();
     item.setId(1);
     item.setBuyerId(1);
     item.setSalerId(1);
     item.setGoodsStatus(2);
     item.setGoodsName("haha");
     User user = new User();
     user.setId(1);
     user.setUserName("a");
     
     GoodsDAOImpl goodsDAO = new GoodsDAOImpl();
    //     goodsDAO.get(2);
    //  System.out.print(goodsDAO.get(1).getGoodsName());
     goodsDAO.Add(user);
     goodsDAO.Add(item);
      

  4.   

    不推荐使用这种方法建立hibernate
    如果你的数据库比较简单不需要建立关系 那么你可以先建库表,通过表来产生持久化类和映射文件
    如果你的数据库比较复杂,需要有关系模型,那么就用先写hibernate映射文件,来生成表和持久化类
    这样保证就不会有问题了,前提是你的写法要正确。
    通过持久化类来生成数据库,这个方法我没试过,理论上应该可行,但是你如果无法操作数据库的存储引擎,字符集,主键等等问题的话,还是比较纠结的
      

  5.   

    好的,等会我用myeclipse reverse hibernate生成持久化类试试看。谢谢指点!
    还有个问题是,那个生成持久化类之后是不是就可以直接用了啊?就跟手动写是一样的,不同的是它没有用@manyToOne或者@Id这些标签,应该都是一样的吧,就是不用自己写了。
      

  6.   

    根据hibernate版本不同 还是有点不一样的 不过不影响使用 写法不变
      

  7.   

    发生了很奇怪的事情:
    DAO写了根据id取对象并打印其属性:
     public Goods get(int goodsId){
          Configuration cfg = new AnnotationConfiguration();
      SessionFactory sf = cfg.configure().buildSessionFactory();
      Session session = sf.openSession();
      session.beginTransaction();
      String hql = "from entity.Goods where Id=:id";
      Query query = session.createQuery(hql);
      query.setString("id", String.valueOf(goodsId));
      List   lists   =   new   ArrayList(); 
      lists = query.list();
      session.getTransaction().commit();
      Iterator   it   =   lists.iterator(); 
      if(it.hasNext()){ 
        Goods   u=(Goods)it.next(); 
                System.out.print(u.getId()); 
                System.out.print(u.getBuyerId()); 
                System.out.print(u.getGoodsStatus()); 
                System.out.print(u.getSalerId()); 
                System.out.print("Annotation --- save complete!");
      }   session.close();
      sf.close();
     
         return null;
        
        }
    经过和数据库中的值对照,打印出来的ID没问题,GoodsStatus也没问题,但是buyerId和salerID的值都变成了null,而它们正是manyToOne的那两列。为什么?
      

  8.   

       dao最好手写
       另外就是 你映射文件当中的主键生成策略用的是哪个类?
      

  9.   


    你的意思是调用删除但是不出错 数据库数据也没删除?
    提交事务了么?与数据库中数据中同步的方法 只要你更新数据的时候通过hibernate的函数更新(hibernate做完后会清理缓存) 而不是自己去库中更新 就没问题 
      

  10.   

    楼上,我的主键生成策略在goods类里:
    public class Goods {
    int Id;
    String goodsName;
    Double goodsPrice;
    String goodsPic;
    String goodsDesc;
    int salerId;
    Date beginTime;
    Date endTime;
    int buyerId;
    int goodsStatus;
    User user;
    User user2;@Id
    @GeneratedValue
    public int getId() {
    return Id;
    }
    public void setId(int Id) {
    this.Id = Id;
    }
      

  11.   

    goods类里的@GeneratedValue 和这个有关系吗?