Thursday, August 4, 2016

JSON Objects : Keeping the natural order

So JSON utilities doesn't guarantee the natural order of the field in an object when its converted to JSON object.
This usually should not be a problem in normal scenario as the order of the fields does not matter when we recreate the object.

But in case its required to pass the JSON object with the natural order of the fields we can make use of LinkedHashmap. Following example shows that how can we keep the natural order of fields in a JSON Object.

Code:

for(int i=0; i < 10; i++){

Map map = new LinkedHashMap(); // Use the LinkedHashMap
map.put("1", "test");
map.put("2", "test");
map.put("3", "test");
map.put("4", "test");
map.put("5", "test");
map.put("6", "test");
map.put("7", "test");
map.put("8", "test");
map.put("9", "true");
map.put("10", "jjjj");

System.out.println("JSON String : " + org.json.simple.JSONObject.toJSONString(map));

}

Output :

JSON String : {"1":"test","2":"test","3":"test","4":"test","5":"test","6":"test","7":"test","8":"test","9":"true","10":"jjjj"}




Tuesday, June 28, 2016

JavaScript - Convert ISO Date to Browser's/ local time zone

JavaScript - Convert ISO Date to Browser's/ local time zone

date.js is pretty handy when we need to manipulate Dates in javascript.

Following two lines of code shows how we can convert an ISO date in UTC to users local time.

Include date.js in your page and create a new Date object passing the ISO date string.
date.js will take care of creating a date object in local timezone using the date object you passed.

Sample Javascript:

var dateTime = new Date("2016-06-28T01:40:12.000Z");

var localTimeFormat = dateTime.toString("MM/dd/yyyy hh:mm tt");

alert(localTimeFormat);


References:



Java Servlet to Download and Return PDF in response

Following is an example of a Servlet which downloads a PDF and returns the PDF as part of HttpResponse.

The source of the PDF can be anything i.e. a local file system, database or any internal file server.
For this example I am using an Http URL for PDF resource.

Things to notice in this program :

  •  Content Type: I am setting content type to application/pdf, it can be changed it something else if your file type is different like image, text, xml etc.
    • response.setContentType("application/pdf");

  • I check for the Response Code  before I try to get the PDF file to make sure URL is valid and the resource exists.
    • if(conn.getResponseCode() != 200)
  • Get the InputStream from the remote file if the reponse code is 200 (file exists).

          inputStream = url.openStream();

          This is available in java 7 and above.


  • Write the binary file stream in response object
    • OutputStream responseOutputStream = response.getOutputStream();
  • Also set caching parameters in response header in case you want your servlet to provide latest copy every time.
                 response.setHeader("pragma","no-cache");
 response.setHeader("cache-control","no-store");
               response.setDateHeader("Expires",0);
  response.addHeader("Pragma", "no-cache");
 response.addHeader("Cache-Control", "no-cache");
 response.addHeader("Cache-Control", "must-revalidate");

Program.

Here is the code. (Please change the PDF_URL  constant in the program to a valid url you would like to use)

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * This Servlet downloads a document from a given url and return as part of the reponse.
 *
 * Servlet implementation class PDFDataServlet
 */
@WebServlet("/pdfdata")
public class PDFDataServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

/**
* Http URL to PDF resource.
*/
private static String PDF_URL = "<<URL>>";
     
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PDFDataServlet() {
        super();
    }

/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/pdf");

InputStream inputStream = null;

try {

URL url = new URL(PDF_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

if(conn.getResponseCode() != 200){
System.out.println("Error Getting the PDF doc");
} else {

inputStream = url.openStream();

/**
* Write the PDF bytes to response.
*/
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = inputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
       inputStream.close();
       
}

conn.disconnect();

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-store");
response.setDateHeader("Expires",0);
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
response.addHeader("Cache-Control", "must-revalidate");

}
}

Monday, June 27, 2016

Pagination using JSON + Jquery

Following is an example of Pagination using JSON and Jquery.

I need to paginate the table on my HTML page using Jquery. Following example illustrates how it can be done. The method paginateJSON creates a paginated table:

paginateJSON(empdata, tableId, createTable, createHeader);

Parameters:
  • empdata - the JSON object with list ob objects i.e. i our case its Employee records.
  • tableId - Table ID attribute
  • createTable - Set to true if table has to be created dynamically from JSON object provided i.e. Employee Data.
  • createHeader - True if the first object or row in JSON Data contains Header column names.

If Table exists call the following 
  • paginateJSON(empdata, "empDataTable", false, false);
else
  • paginateJSON(empdata, "empDataTable", true, true);

  • HTML 
Sample empDataTable to be paginated:


<table id="empDataTable">
<thead>
<tr>
<th>EMPID</th>
<th>NAME</th>
<th>ADDRESS</th>
</tr>
</thead>
<tbody>
<tr style="display: block;">
<td>1</td>
<td>John</td>
<td>1229,Wison Ave, Chicago, IL 60678</td>
</tr>
<tr style="display: block;">
<td>2</td>
<td>Mike</td>
<td>350 5th Ave, New York, NY 10118</td>
</tr>
<tr style="display: block;">
<td>3</td>
<td>Tommy</td>
<td>861 Milwaukee Ave, Chicago IL 60640</td>
</tr>
<tr style="display: block;">
<td>4</td>
<td>Jackson</td>
<td>738 Ashland Ave, Chicago IL 60678</td>
</tr>
<tr style="display: block;">
<td>5</td>
<td>Wilson</td>
<td>566 34th Ave, New York, NY 10118</td>
</tr>
<tr style="display: none;">
<td>6</td>
<td>Eric</td>
<td>1226 Grand St, Chicago IL 60611</td>
</tr>
<tr style="display: none;">
<td>7</td>
<td>Nate</td>
<td>350 5th Ave, New York, NY 10118</td>
</tr>
<tr style="display: none;">
<td>8</td>
<td>Julie</td>
<td>1112 York Rd, Chicago IL 60678</td>
</tr>
<tr style="display: none;">
<td>9</td>
<td>Monica</td>
<td>1514 Wilson St, Chicago IL 60678</td>
</tr>
</tbody>
</table>


  • Java Script

<script>

// Sample JSON Object empdata
       //For each item in our JSON, add a table row and cells to the content string
var empdata = [ {
empid : 'EMPID',
name : 'NAME',
address : 'ADDRESS'
}, {
empid : 1,
name : 'John',
address : '1229,Wison Ave, Chicago, IL 60678'
}, {
empid : 2,
name : 'Mike',
address : '350 5th Ave, New York, NY 10118'
}, {
empid : 3,
name : 'Tommy',
address : '861 Milwaukee Ave, Chicago IL 60640'
}, {
empid : 4,
name : 'Jackson',
address : '738 Ashland Ave, Chicago IL 60678'
}, {
empid : 5,
name : 'Wilson',
address : '566 34th Ave, New York, NY 10118'
}, {
empid : 6,
name : 'Eric',
address : '1226 Grand St, Chicago IL 60611'
}, {
empid : 7,
name : 'Nate',
address : '350 5th Ave, New York, NY 10118'
}, {
empid : 8,
name : 'Julie',
address : '1112 York Rd, Chicago IL 60678'
}, {
empid : 9,
name : 'Monica',
address : '1514 Wilson St, Chicago IL 60678'
}, ];


  • Making a call to paginate method from jquery ready() method.

$(document).ready(function() {

paginateJSON(empdata, "empDataTable", true, true);

});



  •  required Jquery variables

var pgnavDatatable;
var pgnavTotalItems = 0;
var pgnavItemsPerPage = 5;
var pgnavTotalPages = 0;
var pgnavFrom = 0;
var pgnavTo = 0;

/**
* paginateJSON method creates a table from the JSON object passed.
*
* pdata - JSON object containing data to be dynamically added to table.
* id - id attribute of the table.
* createTable - (true/false): If true creates table else assumes table exists in page.
* createHeader - (true/false): If true, creates head row for the table using first row to get header names.
*
*
*/
function paginateJSON(pdata, tableid, createTable, createHeader) {
pgnavTotalItems = pdata.length;
pgnavTotalPages = Math.ceil(pgnavTotalItems / pgnavItemsPerPage);

//drawTable(pdata, tableid, createTable, createHeader);
pgnavDatatable = $("#" + tableid);

/**
* Create a Div for pagination controls.
* Div contains two hidden fields i.e. currentPage and itemsPerPage.
*/
$('body')
.append(
'<div class=controls></div><input id=current_page type=hidden><input id=itemsPerPage type=hidden>');
$('#current_page').val(0);
$('#itemsPerPage').val(pgnavItemsPerPage);

var pgnavBlock = '<a class="prev" onclick="navPrevious()">Prev</a>';
var current_link = 0;
while (pgnavTotalPages > current_link) {
pgnavBlock += '<a class="page" onclick="navigateTo(' + current_link
+ ')" longdesc="' + current_link + '">'
+ (current_link + 1) + '</a>';
current_link++;
}
pgnavBlock += '<a class="next" onclick="navNext()">Next</a>';

$('.controls').html(pgnavBlock);
$('.controls .page:first').addClass('active');

pgnavDatatable.children('tbody').children().css('display', 'none');
pgnavDatatable.children('tbody').children().slice(0, pgnavItemsPerPage)
.css('display', '');
}

function navigateTo(pageNumber) {
var itemsPerPage = parseInt($('#pgnavItemsPerPage').val(), 0);

start_from = pageNumber * pgnavItemsPerPage;

end_on = start_from + pgnavItemsPerPage;

pgnavDatatable.children('tbody').children().css('display', 'none')
.slice(start_from, end_on).css('display', '');

$('.page[longdesc=' + pageNumber + ']').addClass('active').siblings(
'.active').removeClass('active');

$('#current_page').val(pageNumber);
}

function navPrevious() {
new_page = parseInt($('#current_page').val(), 0) - 1;
//if there is an item before the current active link run the function
if ($('.active').prev('.page').length == true) {
navigateTo(new_page);
}
}

function navNext() {
new_page = parseInt($('#current_page').val(), 0) + 1;
//if there is an item after the current active link run the function
if ($('.active').next('.page').length == true) {
navigateTo(new_page);
}
}

function drawTable(data, tableid, createTable, createHeader) {

if (data == null || data == 'undefined') {
return;
}
if (createTable) {
pgnavDatatable = $("<table id='" + tableid + "'></table>");
} else {
pgnavDatatable = $("#" + tableid);
}
var tablehead = $("<thead />");
var tablebody = $("<tbody />");
for (var i = 0; i < data.length; i++) {
var datarow = $("<tr />");
if (createHeader && i == 0) {
datarow.append($("<th>" + data[i].empid + "</th>"));
datarow.append($("<th>" + data[i].name + "</th>"));
datarow.append($("<th>" + data[i].address + "</th>"));
tablehead.append(datarow);

} else {
datarow.append($("<td>" + data[i].empid + "</td>"));
datarow.append($("<td>" + data[i].name + "</td>"));
datarow.append($("<td>" + data[i].address + "</td>"));
tablebody.append(datarow);
}
}
pgnavDatatable.append(tablehead);
pgnavDatatable.append(tablebody);

if (createTable) {
$('body').append(pgnavDatatable);
}
}
</script>


The above code can be tested at following jsfiddle link. Suggestions are welcome.

Pagination Example using Jquery and JSON

Thursday, February 4, 2016

java.lang.LinkageError: loader constraint violation org/slf4j/ILoggerFactory

Getting following exception bringing up a Spring Application on Weblogic 11g while trying to instantiate a Spring Controller.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController' defined in
URL [zip:D:/weblogic/servers/AdminServer/tmp/_WL_user/cservice-ws-ear-1/fd4930/war/WEB-INF/lib/_wl_cls_gen.jar!/
com/testapp/web/controller/TestController.class]:
Instantiation of bean failed; nested exception is java.lang.LinkageError: loader constraint violation:
when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;"
the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, org/slf4j/LoggerFactory,
and the class loader (instance of weblogic/utils/classloaders/GenericClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder,
have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)

Fix:

This is happening due to the conflict between my ear lib and weblogic provided slf4j jars. I found a workaround to run this ear on my local. I set the prefer-web-inf-classes to false in weblogic.xml under WEB-INF

<wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>

The above would use the file provided by weblogic even if it exists in ear lib.

Here is sample weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee       http://java.sun.com/xml/ns/javaee/javaee_5.xsd       http://xmlns.oracle.com/weblogic/weblogic-web-app       http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">

<wls:container-descriptor>
<wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>
</wls:container-descriptor>
    <wls:context-root>deskrev</wls:context-root>

</wls:weblogic-web-app>

Caused By: org.springframework.beans.factory.BeanCreationException: Could not autowire field:

Getting following exception bringing up a Spring Application while trying to instantiate a Spring bean. I have defined the bean and autowired it in my spring controller:

Here is my service. Spring should be instantiated when I bring up the application.

@Service("nameFinderService")
@Lazy(true)
public class NameFinderServiceImpl implements INameFinderService {

}

Here is my Controller where I have autowired the above service:

@Controller
public class MainController{

@Autowired
private INameFinderService nameFinderService;

}

Full Stacktrace:

Caused By: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.nmservice.web.service.INameFinderService com.nmservice.web.base.controller.MainController.nameFinderService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.nmservice.web.service.INameFinderService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:241)



Fix : The package specified in component-scan in spring configuration was specified to a more specific package as I had my spring files in that package, The new spring bean existed one level higher in package. That was the reason it could not find the bean.

I change the following one level up,

from this
<context:component-scan base-package="com.nmservice.web.base" />
to 
<context:component-scan base-package="com.nmservice.web" />

And the issue got resolved.

Tuesday, February 2, 2016

Android Studio - Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.CoordinatorLayout"

Getting following exception while trying to run a Test app. My Activity extends AppCompatActivity.

The exception is thrown when I call setContentView with activity name under onCreate() method.

setContentView(R.layout.activity_welcome_screen);

I see the underlying issue is following :

Suppressed: java.lang.ClassNotFoundException: android.support.design.widget.CoordinatorLayout

Here is the full stack trace:

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.CoordinatorLayout" on path: DexPathList[[zip file "/data/app/com.mobile.app.android-2/base.apk"],nativeLibraryDirectories=[/data/app/com.
is.mobile.app.android-2/lib/arm64, /vendor/lib64, /system/lib64]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
            at android.view.LayoutInflater.createView(LayoutInflater.java:578)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:483) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
            at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256) 
            at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)                         
            at android.app.Activity.performCreate(Activity.java:6550) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3108) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263) 
            at android.app.ActivityThread.access$1000(ActivityThread.java:197) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:145) 
            at android.app.ActivityThread.main(ActivityThread.java:6897) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
            Suppressed: java.lang.ClassNotFoundException: android.support.design.widget.CoordinatorLayout
            at java.lang.Class.classForName(Native Method)
            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 23 more
             Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
02-02 11:46:56.471 28238-28238/com.mobile.app.android I/Process: Sending signal. PID: 28238 SIG: 9

Saturday, January 30, 2016

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.test.TestDO
    at org.hibernate.id.Assigned.generate(Assigned.java:34)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
    at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:255)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:235)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:173)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:849)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:831)
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:260)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:379)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:304)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:146)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:412)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:344)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:307)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:146)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:95)
    at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:468)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:327)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:839)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:821)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:826)



Fix:

If you have specified Auto Increment for the Primary Key field, then you can specify "identity" as a generator class in hibernate config file as shown below:



<hibernate-mapping>
    <class name="com.test.service.dataobjects.TestDO" table="test">
    <id name="test" column="testId">
        <generator class="identity"/>
    </id>

....
....
</hibernate-mapping>