1. 程式人生 > >初學hibernate用原生SQL 或 save方法進行insert操作+jQuery製作簡易留言板+Unknown Entity報錯

初學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)

  

主鍵(id)自增:id資料型別設為serial

配置檔案cfg.xml

<hibernate-configuration>
 <session-factory>
 
  <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/jspdb?useUnicode=true&characterEncoding=UTF-8</property>
  <property name="hibernate.connection.username">username</property>
  <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<!--重點-->
 <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property><!--用於解決報錯Disabling contextual LOB creation as createClob() method threw err-->
 <property name="show_sql">true</property><!--顯示SQL語句-->
<property name="connection.autocommit">true </property> 
<!--同一個專案不需要多次新建配置檔案,在hibernate.cfg.xml裡新增對映檔案路徑即可,否則mapping報錯Unknown Entity-->
  <mapping class="LoginUsers.beans.Users" resource="loginusers/beans/Users.hbm.xml"/>
  <mapping class="LoginUsers.beans.Messas" resource="loginusers/beans/Messas.hbm.xml"/>
  
 </session-factory>

 
</hibernate-configuration>


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

<hibernate-mapping>
    <class name="loginusers.beans.Messas" table="MESSAS">
        <id name="id" type="java.lang.String">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="mname" type="java.lang.String">
            <column name="MNAME" />
        </property>
        <property name="subject" type="java.lang.String">
            <column name="SUBJECT" />
        </property>
        <property name="memo" type="java.lang.String">
            <column name="MEMO" />
        </property>
    </class>
</hibernate-mapping>

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:

<html xmlns="http://www.w3.org/1999/xhtml">
 <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>留言板</title>
<script type="text/javascript">  
$(function(){  
       $("#tijiao").click(function(){ 
           var name=$("#name").val();  
           var subject = $("#subject").val();
           var memo=$("#memo").val();  
      $.post("savemsg", {"name" : name,"subject":subject,"memo":memo}, function(msg) {
				alert(msg);
				});
      alert("aa");});
     
		 $(".cz").click(function (){   //設定重置按鈕,點選清空留言板
          $("#memo").val('');
		   
            })
      
       })
     
     </script>
</head>
<body>
<h2><!-- 【${user.username}】 -->請發表你的留言</h2>
<div id="menu">  
    <p>暱稱:<input type="text" id="name"></p> 
    <p>主題:<input type="text" id="subject"></p>
    <p>內容:</p>
    <p><textarea value="在這留言" style="width: 600px; height: 150px"id="memo">在這留言</textarea></p>  
    <p><input type="button" value="提交" id="tijiao">  <input type="button" value="重置" class="cz" ></p> 
  
    <p><h1>所有留言</h1></p>  
    <ul id="ul1">  
    </ul>  
    </div>  
</body>
</html>

本地伺服器執行jsp:


點選提交後資料庫:


彩蛋:其實用save方法也是可以完成主鍵自增的插入,改兩處即可,這裡不贅述,上圖。。。


相關推薦

初學hibernate原生SQL save方法進行insert操作+jQuery製作簡易留言+Unknown Entity

知識點:1,hql是沒有直接insert的語句2,使用hibernate對資料庫(postgresql)進行插入資料操作(法一:原生SQL的insert;法二:hibernate自帶save方法)3,設定主鍵自增4,mapping報錯Unknown Entity(情況一:設定

Hibernate執行原生SQL

nts rest tar current dex string new ash star 1、查詢指定字段 public List<Object[]> getUseList( Integer index, Integer offset, String

解決jpa原生sql無法分頁的問題

1、獲取介面傳來的分頁引數 String page_id=request.getParameter("page_id");//頁碼 String limit=request.getParameter("limit"); //每頁資料條數 //判斷為空時賦予初始值 if(StringUtil

hibernate使用原生SQL使用count統計表記錄的數量

本例基於SSH框架。 public int getCountByUserCodeAndTel(String userCode, String tel) {         int count = 0;      &n

Hibernate原生sql處理及結果集和VO的對映

昨天解決一個看似很簡單的需求, 我有一個類似下面的table(info_table),是收集產品使用的機型資訊: id type model 1 nokia xxx1 2 nokia xxx2 3 Motorola yyyy1

Hibernate使用原生SQL多表查詢時欄位名相同導致查詢資料覆蓋問題解決辦法

系統測試環境: MySQL 5.0 Hibernate 3.3 由於使用了hibernate,雖然使用原生SQL繞過了hibernate自己的封裝,但是還是有些影響,比如欄位別名問題;相同的欄位名經過hibernate查詢會出現前一列覆蓋後一列的情況,這時可以用 方法來

Hibernate解決原生SQL對映為物件的問題探究

       如何將使用本地原生SQL查詢出來的結果對映為值物件的問題,這裡就Hibernate中提供的方法做個結論。前提,這裡沒有使用屬性的延遲載入技術。   假設有個值對像,如下:Java程式碼  package test;    public class Person

hibernate使用原生sql查詢,返回List Map String, Object ,並重命名返回資料列名稱

hibernate使用原生sql查詢時返回的欄位不能重新命名 例如使用如下sql查詢時報錯 sql = "SELECT t.type_name as `name`,SUM(o.circulation) FROM " +

Hibernate執行原生sql時,將資料庫的char(n)型別轉換成了character型別的解決方案

在使用Hibernate的原生態SQL對Oracle進行查詢時,碰到查詢char型別的時候始終返回的是一個字元,開始認為應該是Hibernate在做對映的把資料型別給對映成char(1),在經過查詢網上的一些資料,得知產生這個問題的主要原因確實是Hibernate再查詢Or

[Android L]SEAndroid開放裝置檔案結點許可權(讀寫)方法(涵蓋常用操作:sys/xxx、proc/xxx、SystemProperties)熱門乾貨

溫馨提示 1 現象描述 基於Android L版本原始碼環境進行開發時,根據專案需求,APP層需要操作sys/xxx 或 proc/xxx下面的檔案結點,但是會報出以下許可權異常,無法直接操作這些結點 LedLightFileUtil( 4671): java.io

C#WinForm連線本地遠端Sql資料庫,並進行簡單操作

在學習C#課程時,看到課本有相關內容的介紹。想起如果自己能做一個操作資料庫的小軟體應該不錯。 所需要的知識基礎就是sql的一些語句和C#的ADO.NET。 主要就是Connection、Command、DataReader和Dataset,還有就是DataAdapter等封

hibernate映射實體類查詢時數據庫空字段賦值給實體類的問題

config 設置 lan 實體 網上 pre ava more val   因為一直報實體類空異常,去網上查了資料只查到了並沒有查到數據庫空值時不給實體類賦值的屬性,只有這兩個屬性   這兩個屬性時設置 實體類有空字段插入或更新 數據庫時空屬性為默認值 異常 org.

elasticsearch(三)java 分別使用同步和非同步方法進行刪除操作

一、 基本步驟: 1)建立連線物件: RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(

elasticsearch(二)java 使用同步步方法進行查詢操作

一、 基本步驟: 1)建立連線物件: RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(

Ubuntu14.04(估計16.04也可以,參照的就是16.04)+opencv + caffe(GPU版) + cuDnn超詳細包括

lalalalala~ 經過一星期的折磨,總算把caffe配置好,感謝網上大神們的助攻。 查看了好多的部落格,多多少少存在著坑。然後不停的在查詢與修改,終於把caffe裝進自己的碗裡。在成功執行caffe後兩天,特意分享一下caffe的配置過程,幫助後來有需要配置的人。 配置過程參考了https

elasticsearch(三)java 使用同步步方法進行刪除操作

一、 基本步驟: 1)建立連線物件: RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(

Servlet 使用getRequestDispatcher進行請求轉發頁面未跳轉 後臺也未的問題的解決方法

問題描述: 在Servlet中使用getRequestDispatcher進行請求轉發的時候,前端頁面空白未出現報錯,後臺也沒有報錯。 原因分析: getRequestDispatcher的路徑沒有問題 也存在相應的jsp頁面 前端沒有出現錯誤 後臺也沒有

jquery製作簡易日曆

html程式碼如下: div align="center" id="divAll"> <table id="tab" border="1" cellpadding="0" cellspacing="10"> <tr> <td date="一月

在英文操作系統上使用Microsoft SQL Server Management Studio(SSMS)導入Excel 97-2003文件

ssm data manage 分享 服務 sms com 公司 database 今天在公司服務器上使用Microsoft SQL Server Management Studio(SSMS)導入Excel 97-2003文件(.xls)報錯: Failure cr

hibernatesave方法sqlinsert的區別

foreign try cat values key update out onf nat public boolean addDiscuss(Discuss discuss) {// Session session = HibernateSessionFactory.g