太晕了,小可刚才用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!");
}
请问如何能让持久化类和数据库中的数据同步一下,来避免这种错误? 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!");
}
但是数据库中的表总不能每次用户登录进来都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);
如果你的数据库比较简单不需要建立关系 那么你可以先建库表,通过表来产生持久化类和映射文件
如果你的数据库比较复杂,需要有关系模型,那么就用先写hibernate映射文件,来生成表和持久化类
这样保证就不会有问题了,前提是你的写法要正确。
通过持久化类来生成数据库,这个方法我没试过,理论上应该可行,但是你如果无法操作数据库的存储引擎,字符集,主键等等问题的话,还是比较纠结的
还有个问题是,那个生成持久化类之后是不是就可以直接用了啊?就跟手动写是一样的,不同的是它没有用@manyToOne或者@Id这些标签,应该都是一样的吧,就是不用自己写了。
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的那两列。为什么?
另外就是 你映射文件当中的主键生成策略用的是哪个类?
你的意思是调用删除但是不出错 数据库数据也没删除?
提交事务了么?与数据库中数据中同步的方法 只要你更新数据的时候通过hibernate的函数更新(hibernate做完后会清理缓存) 而不是自己去库中更新 就没问题
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;
}