初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错

知识点:

1,hql是没有直接insert的语句

2,使用hibernate对数据库(postgresql)进行插入数据操作(法一:原生SQL的insert;法二:hibernate自带save方法)

3,设置主键自增

4,mapping报错Unknown Entity(情况一:设置@Entity映射是导错jar;情况二:未向配置文件cfg.xml加入映射文件hbm.xml;情况三:一个project里生成两个配置文件啊!!太愚蠢了我就是因为这个找了一天的bug最后在老师提点下才知道只需要建一个cfg.xml文件然后每次只需要添加映射的mapping语句即可)

以上具体解决法请看代码                                   ps:有彩蛋!

在次解释一下,通常情况下是利用hibernate自带的save()方法提交事务后即可向数据库中插入数据,但此处制作留言板需要主键id每插入一条就自增一次。如果每次使用save方法会导致主键值重复的问题,原因:

hibernate的save方法:当主键一样的时候,第二次调用save方法就是执行更新操作

彩蛋有该问题解决方法,对比起来使用原生SQL更方便


正式开始                                                                                                                     


数据库设计(表名:messa)

初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错_第1张图片  

主键(id)自增:id数据类型设为serial

配置文件cfg.xml


 
 
  org.postgresql.Driver
  password
  jdbc:postgresql://localhost:5432/jspdb?useUnicode=true&characterEncoding=UTF-8
  username
  org.hibernate.dialect.PostgreSQLDialect

 false
 true
true  

  
  
  
 

 



bean:

import javax.persistence.Entity; //一定注意不要导错这个包,如果导入的是org.hibernate带的会导致mapping报错Unknown Entity
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "messa")

public class Messas {
	
	
	@Id      //id映射位置不要写错。对应private int id
	private int id;
	private String mname;
	private String subject;
	private String memo;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getMname() {
		return mname;
	}

	public void setMname(String mname) {
		this.mname = mname;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getMemo() {
		return memo;
	}

	public void setMemo(String memo) {
		this.memo = memo;
	}

	
}

Messas类 对应生成的映射文件hbm.xml


    
        
            
            
        
        
            
        
        
            
        
        
            
        
    

Dao:

import java.sql.PreparedStatement;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import loginusers.beans.Messas;


public class MessasDao {
	public void insertMsg(String mname,String subject,String memo) {
	
//	 	StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
//	 	SessionFactory sf = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
//		Session session = sf.openSession();
//		
	Session session =getSession();
	session.beginTransaction();
//在hibernate中执行原生SQL的insert语句完成插入操作
 String sql="insert into messa(mname,subject,memo) values(?,?,?)";
	  SQLQuery query = session.createSQLQuery(sql);
	  query.addEntity(Messas.class);
	 query.setString(0,mname);
     query.setString(1,subject);
     query.setString(2,memo);
    query.executeUpdate();//提交至数据库
//		Messas msg = new Messas();
//		msg.setMname(mname);
//		msg.setSubject(subject);
//		msg.setMemo(memo);
	//System.out.println(mname+""+subject+""+memo);
//		session.save(msg);
	//session.getTransaction().commit();//提交事务至数据库
  	session.close();
	}
	private Session getSession() {
 	StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
	 	SessionFactory sf = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
	Session session = sf.openSession();
		return session;
	}
}

servlet:

public class savemsg extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
    public savemsg() {
        super();
     
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out=response.getWriter();
		String name=request.getParameter("name");
		String subject=request.getParameter("subject");
		String memo=request.getParameter("memo");
			
		MessasDao mdao=new MessasDao();
		mdao.insertMsg(name, subject,memo);
		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		doGet(request, response);
	}

}

jsp:


 



留言板



请发表你的留言


本地服务器运行jsp:

初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错_第2张图片

点击提交后数据库:

初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错_第3张图片


彩蛋:其实用save方法也是可以完成主键自增的插入,改两处即可,这里不赘述,上图。。。

初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错_第4张图片

初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错_第5张图片

你可能感兴趣的:(初学hibernate用原生SQL 或 save方法进行insert操作+jQuery制作简易留言板+Unknown Entity报错)