Why Lazy Initialization Exception in Hibernate polymorphic Assosiation after making it FetchType.Eagar? - spring

Getting Lazy Initialization Exception even after making FetchType.Eagar
I am trying something like this from spring service class
List<DeviceTree> deviceTree = deviceTreeRepository.findByCustomerId( customerId );
DeviceTree tree = deviceTree.get(0);
Node node = tree.getNode();
if(node instanceof Device){
System.out.println("Device");
Device dev= (Device)node;
System.out.println(dev.getIddevice());
System.out.println(dev.getIp());
}
But getting exception
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.abc.collygo.data.entities.Device_$$_jvst69a_3d.getIddevice(Device_$$_jvst69a_3d.java)
at com.abc.collygo.data.services.impl.DeviceTreeService.findAll(DeviceTreeService.java:52)
at com.abc.collygo.core.startup.LoadPdtSplitter.getSplit(LoadPdtSplitter.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:407)
at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:278)
at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:251)
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:166)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105)
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:67)
at org.apache.camel.language.bean.BeanExpression$InvokeProcessor.process(BeanExpression.java:189)
at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:123)
at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:132)
at org.apache.camel.processor.Splitter.createProcessorExchangePairs(Splitter.java:103)
at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:208)
at org.apache.camel.processor.Splitter.process(Splitter.java:98)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:139)
at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:64)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Here is my DeviceTree Entity. I have node_id which can either be a device or a logical group. I was trying to implement Hibernate Polymorphic Assosiation .
#Entity
#Table(name = "device_tree")
#NamedQuery(name = "DeviceTree.findAll", query = "SELECT d FROM DeviceTree d")
public class DeviceTree implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "iddevice_tree")
private int iddeviceTree;
#Column(name = "customer_id")
private int customerId;
#Column(name = "is_disabled")
private boolean isDisabled;
private int lft;
#Column(name = "node_id")
private int nodeId;
#Any( fetch=FetchType.EAGER,metaColumn = #Column(name = "node_type_id"))
#AnyMetaDef(idType = "integer", metaType = "integer", metaValues = {
#MetaValue(targetEntity = Device.class, value = "1"),
#MetaValue(targetEntity = LogicalGroup.class, value = "2") })
#JoinColumn(name = "node_id" , insertable=false ,updatable=false)
private Node node;
#Column(name = "node_name")
private String nodeName;
#Column(name = "parent_id")
private Integer parentId;
private int rgt;
// uni-directional many-to-one association to Location
#ManyToOne(fetch = FetchType.EAGER)
#JoinColumn(name = "location_id")
#Fetch(FetchMode.JOIN)
private Location location;
// uni-directional many-to-one association to NodeType
#ManyToOne(fetch = FetchType.EAGER)
#JoinColumn(name = "node_type_id")
#Fetch(FetchMode.JOIN)
private NodeType nodeType;
// uni-directional many-to-one association to StatusDetail
#ManyToOne(fetch = FetchType.EAGER)
#JoinColumn(name = "status_details_id")
#Fetch(FetchMode.JOIN)
private StatusDetail statusDetail;
public DeviceTree() {
}
public int getCustomerId() {
return customerId;
}
public int getIddeviceTree() {
return iddeviceTree;
}
public int getLft() {
return lft;
}
public Location getLocation() {
return location;
}
public int getNodeId() {
return nodeId;
}
public String getNodeName() {
return nodeName;
}
public NodeType getNodeType() {
return nodeType;
}
public int getRgt() {
return rgt;
}
public StatusDetail getStatusDetail() {
return statusDetail;
}
public boolean isDisabled() {
return isDisabled;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public void setDisabled(boolean isDisabled) {
this.isDisabled = isDisabled;
}
public void setIddeviceTree(int iddeviceTree) {
this.iddeviceTree = iddeviceTree;
}
public void setLft(int lft) {
this.lft = lft;
}
public void setLocation(Location location) {
this.location = location;
}
public void setNodeId(int nodeId) {
this.nodeId = nodeId;
}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
public void setNodeType(NodeType nodeType) {
this.nodeType = nodeType;
}
public void setRgt(int rgt) {
this.rgt = rgt;
}
public void setStatusDetail(StatusDetail statusDetail) {
this.statusDetail = statusDetail;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public Node getNode() {
return node;
}
public void setNode(Node node) {
this.node = node;
}
}
This is my Device class
#Entity
#Table(name = "device")
#Cacheable
#Cache( usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE )
#NamedQuery( name = "Device.findAll", query = "SELECT d FROM Device d" )
public class Device implements Serializable ,Node{
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue( strategy = GenerationType.IDENTITY )
private int iddevice;
#Temporal( TemporalType.TIMESTAMP )
#Column( name = "connection_status_update_time" )
private Date connectionStatusUpdateTime;
#Temporal( TemporalType.TIMESTAMP )
#Column( name = "creation_time" )
private Date creationTime;
#Column( name = "customer_id" )
private int customerId;
#Column( name = "description" )
private String description;
#Column( name = "ip" )
private String ip;
#Column( name = "location" )
private String location;
#Column( name = "name" )
private String name;
#Column( name = "port" )
private int port;
#Column( name = "serial_key" )
private String serialKey;
#Temporal( TemporalType.TIMESTAMP )
#Column( name = "system_status_update_time" )
private Date systemStatusUpdateTime;
#Column( name = "user_id" )
private int userId;
#Column( name = "device_firmware_id" )
private int deviceFirmware;
#Column( name = "device_hardware_id" )
private int deviceHardware;
#Column( name = "device_make_id" )
private int deviceMake;
#Column( name = "device_model_id" )
private int deviceModel;
#Column( name = "device_template_id" )
private int deviceTemplateId;
#Column( name = "device_type_id" )
private int deviceType;
#ManyToOne( fetch = FetchType.LAZY )
#JoinColumn( name = "system_status_id" )
#Fetch(FetchMode.JOIN)
private StatusDetail systemStatus;
#Column( name = "system_status_id",insertable=false,updatable=false)
private int systemStatusId;
#Column( name = "connection_status_id" )
private int connectionStatus;
#Column( name = "device_param1" )
private String deviceParam1;
#Column( name = "device_param2" )
private String deviceParam2;
#Column( name = "device_param3" )
private String deviceParam3;
#Column( name = "device_param4" )
private String deviceParam4;
#Column( name = "device_param5" )
private String deviceParam5;
#Column( name = "is_disabled", length = 1, columnDefinition = "BIT" )
private boolean isDisabled;
#Column( name = "suppress_alarm", length = 1, columnDefinition = "BIT" )
private boolean suppressAlarm;
#Column( name = "parent_device_id" )
private Integer parentDeviceId;
#Column( name = "datapoint_set_config_id" )
private Integer datapointSetConfigId;
#OneToMany( mappedBy = "device",fetch = FetchType.EAGER)
#Fetch(FetchMode.JOIN)
private List<DeviceProperties> deviceProperties;
#ManyToOne( fetch = FetchType.LAZY )
#JoinColumn( name = "device_template_id", insertable = false, updatable = false )
#Fetch(FetchMode.JOIN)
private DeviceTemplate deviceTemplate;
public Device() {
}
public int getConnectionStatus() {
return connectionStatus;
}
public Date getConnectionStatusUpdateTime() {
return connectionStatusUpdateTime;
}
public Date getCreationTime() {
return creationTime;
}
public int getCustomerId() {
return customerId;
}
public Integer getDatapointSetConfigId() {
return datapointSetConfigId;
}
public String getDescription() {
return description;
}
public int getDeviceFirmware() {
return deviceFirmware;
}
public int getDeviceHardware() {
return deviceHardware;
}
public int getDeviceMake() {
return deviceMake;
}
public int getDeviceModel() {
return deviceModel;
}
public String getDeviceParam1() {
return deviceParam1;
}
public String getDeviceParam2() {
return deviceParam2;
}
public String getDeviceParam3() {
return deviceParam3;
}
public String getDeviceParam4() {
return deviceParam4;
}
public String getDeviceParam5() {
return deviceParam5;
}
public int getDeviceTemplateId() {
return deviceTemplateId;
}
public int getDeviceType() {
return deviceType;
}
public int getIddevice() {
return iddevice;
}
public String getIp() {
return ip;
}
public String getLocation() {
return location;
}
public String getName() {
return name;
}
public Integer getParentDeviceId() {
return parentDeviceId;
}
public int getPort() {
return port;
}
public String getSerialKey() {
return serialKey;
}
public StatusDetail getSystemStatus() {
return systemStatus;
}
public Date getSystemStatusUpdateTime() {
return systemStatusUpdateTime;
}
public int getUserId() {
return userId;
}
public boolean isDisabled() {
return isDisabled;
}
public boolean isSuppressAlarm() {
return suppressAlarm;
}
public void setConnectionStatus(int connectionStatus) {
this.connectionStatus = connectionStatus;
}
public void setConnectionStatusUpdateTime(Date connectionStatusUpdateTime) {
this.connectionStatusUpdateTime = connectionStatusUpdateTime;
}
public void setCreationTime(Date creationTime) {
this.creationTime = creationTime;
}
public void setCustomerId(int cutomerId) {
customerId = cutomerId;
}
public void setDatapointSetConfigId(Integer datapointSetConfigId) {
this.datapointSetConfigId = datapointSetConfigId;
}
public void setDescription(String description) {
this.description = description;
}
public void setDeviceFirmware(int deviceFirmware) {
this.deviceFirmware = deviceFirmware;
}
public void setDeviceHardware(int deviceHardware) {
this.deviceHardware = deviceHardware;
}
public void setDeviceMake(int deviceMake) {
this.deviceMake = deviceMake;
}
public void setDeviceModel(int deviceModel) {
this.deviceModel = deviceModel;
}
public void setDeviceParam1(String deviceParam1) {
this.deviceParam1 = deviceParam1;
}
public void setDeviceParam2(String deviceParam2) {
this.deviceParam2 = deviceParam2;
}
public void setDeviceParam3(String deviceParam3) {
this.deviceParam3 = deviceParam3;
}
public void setDeviceParam4(String deviceParam4) {
this.deviceParam4 = deviceParam4;
}
public void setDeviceParam5(String deviceParam5) {
this.deviceParam5 = deviceParam5;
}
public void setDeviceTemplateId(int deviceTemplateId) {
this.deviceTemplateId = deviceTemplateId;
}
public void setDeviceType(int deviceType) {
this.deviceType = deviceType;
}
public void setDisabled(boolean isDisabled) {
this.isDisabled = isDisabled;
}
public void setIddevice(int iddevice) {
this.iddevice = iddevice;
}
public void setIp(String ip) {
this.ip = ip;
}
public void setLocation(String location) {
this.location = location;
}
public void setName(String name) {
this.name = name;
}
public void setParentDeviceId(Integer parentDeviceId) {
this.parentDeviceId = parentDeviceId;
}
public void setPort(int port) {
this.port = port;
}
public void setSerialKey(String serialKey) {
this.serialKey = serialKey;
}
public void setSuppressAlarm(boolean suppressAlarm) {
this.suppressAlarm = suppressAlarm;
}
public void setSystemStatus(StatusDetail systemStatus) {
this.systemStatus = systemStatus;
}
public void setSystemStatusUpdateTime(Date systemStatusUpdateTime) {
this.systemStatusUpdateTime = systemStatusUpdateTime;
}
public void setUserId(int userId) {
this.userId = userId;
}
public List<DeviceProperties> getDeviceProperties() {
return deviceProperties;
}
public void setDeviceProperties(List<DeviceProperties> deviceProperties) {
this.deviceProperties = deviceProperties;
}
public DeviceTemplate getDeviceTemplate() {
return deviceTemplate;
}
public void setDeviceTemplate(DeviceTemplate deviceTemplate) {
this.deviceTemplate = deviceTemplate;
}
public int getSystemStatusId() {
return systemStatusId;
}
public void setSystemStatusId(int systemStatusId) {
this.systemStatusId = systemStatusId;
}
}
This is the interface declare for supporting polmorphic assosiation
public interface Node {
}
I have enabled OpenEntityFilter for solving Lazy Initialization in Spring
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
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/web-app_3_0.xsd">
<!-- Dispatcher Servlet -->
<servlet>
<servlet-name>collygo-core-config</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>collygo-core-config</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- location of spring xml files -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:collygo-core-config.xml</param-value>
</context-param>
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.abc.collygo.core.init.CollygoApplicationContextInitializer</param-value>
</context-param>
<!-- the listener that kick-starts Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Try to solve lazy loading -->
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Camel servlet -->
<servlet>
<servlet-name>CamelServlet</servlet-name>
<servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Camel servlet mapping -->
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/camel/*</url-pattern>
</servlet-mapping>
<!--Spring Security Filters -->
</web-app>
Here is my spring config for Data Acess
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:repository="http://www.springframework.org/schema/data/repository"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- Declare a JPA entityManagerFactory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="jpaDataSource" p:jpaVendorAdapter-ref="hibernateVendor"
p:packagesToScan="com.abc.collygo.data.entities"
p:jpaProperties-ref="hibernateConfig" p:jpaDialect-ref="jpaDialect"
p:persistenceProvider-ref="hibernatePersistence"
p:persistenceUnitName="entityManagerFactory" />
<!-- Declare a datasource that has pooling capabilities -->
<bean id="jpaDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driverClassName}" />
<property name="jdbcUrl" value="${database.url}" />
<property name="user" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="acquireIncrement" value="1" />
<property name="acquireRetryAttempts" value="3" />
<property name="acquireRetryDelay" value="300" />
<property name="initialPoolSize" value="100" />
<property name="maxPoolSize" value="200" />
<property name="minPoolSize" value="1" />
</bean>
<aop:config proxy-target-class="true">
</aop:config>
<aop:aspectj-autoproxy proxy-target-class="true" />
<tx:annotation-driven mode="aspectj" />
<!-- Declare a Hibernate Vendor -->
<bean id="hibernateVendor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:showSql="false" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
<!-- Declare a Hibernate Config -->
<util:map id="hibernateConfig">
<entry key="hibernate.hbm2ddl.auto" value="validate" />
<entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<entry key="hibernate.show_sql" value="false" />
<entry key="hibernate.connection.zeroDateTimeBehavior" value="convertToNull" />
<entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
<entry key="hibernate.cache.use_second_level_cache" value="true"/>
<entry key="hibernate.cache.use_query_cache" value="true"/>
</util:map>
<!-- Declare a JPA Dialect -->
<bean name="jpaDialect"
class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
<bean id="hibernatePersistence" class="org.hibernate.ejb.HibernatePersistence">
</bean>
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com.abc.collygo.data.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager">
<!-- <repository:include-filter type="regex" expression="com.gdev.vim.repository.*"/> -->
</jpa:repositories>
</beans>
I am using spring data . Here is my Repository class
#Repository
public interface DeviceTreeRepository extends CrudRepository<DeviceTree, Integer> {
#Query( "SELECT d FROM DeviceTree d where d.customerId=:customerId AND d.iddeviceTree BETWEEN :left AND :right AND d.isDisabled=false" )
List<DeviceTree> getNodes(#Param( "left" ) int left, #Param( "right" ) int rgt,
#Param( "customerId" ) int customerId);
#Query( "SELECT d FROM DeviceTree d FETCH ALL PROPERTIES where d.customerId=:customerId AND d.isDisabled=false" )
List<DeviceTree> findByCustomerId( #Param( "customerId" )int customerId);
#Query( "SELECT d FROM DeviceTree d where d.customerId=:customerId AND d.nodeType.idnodeType=:nodeType AND d.iddeviceTree BETWEEN :left AND :right AND d.isDisabled=false" )
List<DeviceTree> getNodesforNodeType(#Param( "left" ) int left, #Param( "right" ) int right,
#Param( "nodeType" ) int nodeType, #Param( "customerId" ) int customerId);
#Query( "SELECT d FROM DeviceTree d where d.customerId=:customerId AND d.statusDetail.idstatus=:statuslist AND d.iddeviceTree BETWEEN :left AND :right AND d.isDisabled=false" )
List<DeviceTree> getNodesforStatus(#Param( "left" ) int left, #Param( "right" ) int right,
#Param( "statuslist" ) List<Integer> statuslist,
#Param( "customerId" ) int customerId);
#Query( "SELECT d FROM DeviceTree d where d.customerId=:customerId AND d.nodeType.idnodeType=:nodeTypeId AND d.isDisabled=false")
List<DeviceTree> findByNodeTypeId(#Param( "nodeTypeId" )int nodeTypeId,#Param( "customerId" ) int customerId);
#Query( "SELECT d FROM DeviceTree d where d.customerId=:customerId AND d.nodeType.idnodeType in :nodeTypes AND d.isDisabled=false")
List<DeviceTree> findByNodeType(#Param( "nodeTypes" )List<Integer> nodeTypes,#Param( "customerId" ) int customerId);
}

Related

Spring Boot -Hibernate 5 simple application initializing in 3 minutes

I am using Spring boot with Hibernate to connect with Oracle database. The application works fine but when I run the application with Dddl.auto flag set to update it takes 3 minutes just to initialize the entity manager. here are my model classes and cfg.xml.
Hibernate.cfg.xml
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"classpath://org/hibernate/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:#hhhh.cpckubosallr.ap-south-1.rds.amazonaws.com:1610:gghg</property>
<property name="hibernate.connection.username">DEMO</property>
<property name="hibernate.connection.password">ggggg#78GHTd</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.connection.pool_size">5</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="hbm2ddl.auto">update</property>
<mapping class ="student.mappings.model.Student" />
<mapping class ="student.mappings.model.Vehicle" />
<mapping class ="student.mappings.model.Subject" />
</session-factory>
</hibernate-configuration>
Model classes:
#Entity
#Table(name="STUDENT", schema="JAVACODE")
public class Student
{
#Id
#GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
#Column(name="name")
private String name;
#OneToOne(cascade=CascadeType.ALL)
#JoinColumn(name="vehicle_id")
private Vehicle vehicle;
#Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", vehicle=" + vehicle + ", subject=" + subject + "]";
}
public Vehicle getVehicle()
{
return vehicle;
}
public void setVehicle(Vehicle vehicle)
{
this.vehicle = vehicle;
}
#OneToMany(cascade=CascadeType.ALL)
#JoinColumn(name="subject_id")
private List<Subject> subject;
public List<Subject> getSubject()
{
return subject;
}
public void setSubject(List<Subject> subject)
{
this.subject = subject;
}
public Student(Long id, String name, Vehicle vehicle, List<Subject> subject)
{
super();
this.id = id;
this.name = name;
this.vehicle = vehicle;
this.subject = subject;
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Student()
{
super();
}
public Student(Long id, String name)
{
super();
this.id = id;
this.name = name;
}
public Student(Long id, String name, Vehicle vehicle) {
super();
this.id = id;
this.name = name;
this.vehicle = vehicle;
}
}
Application.java:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
#SpringBootApplication
#ComponentScan("student.mappings")
#EntityScan("student.mappings")
#PropertySource(value= {"classpath:application.properties"})
public class StudentMappingsTemplateClient
{
public static void main(String[] args) {
SpringApplication.run(StudentMappingsTemplateClient.class, args);
}
}

javax.el.MethodNotFoundException: Method not found:

Spring - Hibernate
Newbie here, can please somebody help me locate what i'm missing. I am trying to do a onetomany relationship of payee and payor. My issue is im getting this error:
javax.el.MethodNotFoundException: Method not found: class com.supportmanagement.model.Payee.getPayor()
javax.el.Util.findWrapper(Util.java:349)
javax.el.Util.findMethod(Util.java:211)
javax.el.BeanELResolver.invoke(BeanELResolver.java:150)
List.jsp
{payeelist} came from my controller via map.put("payeelist", payeeServices.getPayees());
...
<c:forEach items="${payeelist}" var="payee" varStatus="payeeindex">
<tr>
<td class="pad-0"> </td>
<td><c:out value="${payee.getCaseNumber()}" /></td>
<td><c:out value="${payee.getLastname()}" /></td>
<td><c:out value="${payee.getFirstname()}" /></td>
<td><c:out value="${payee.getMiddlename()}" /></td>
<td class="text-center"><a href="/SupportManager/payor/add?casenumber=${payee.getCaseNumber()}">
${payee.getPayor().getCaseNumber()}
</a></td>
<td class="text-center">ADD PAYMENT <i class="glyphicon glyphicon-envelope"></i> </td>
</tr>
</c:forEach>
...
Payee.java
package com.supportmanagement.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
#Entity
#Table(name = "payeeMaster")
public class Payee implements Serializable {
private static final long serialVersionUID = 5876875389515595233L;
#Id
#Column(name = "CaseNumber", unique = true, nullable = false)
private String CaseNumber;
#Column(name = "Firstname")
private String Firstname;
#Column(name = "Lastname")
private String Lastname;
#Column(name = "Middlename")
private String Middlename;
#Column(name = "Address1")
private String Address1;
#Column(name = "Address2")
private String Address2;
#Column(name = "City")
private String City;
#Column(name = "State")
private String State;
#Column(name = "Zip")
private String Zip;
#Column(name = "HomePhone")
private String HomePhone;
#Column(name = "MobilePhone")
private String MobilePhone;
#Column(name = "Active")
private int Active;
#Column(name = "Comments")
private String Comments;
#Column(name = "StateCode")
private String StateCode;
#Column(name = "PA")
private int PA;
#Column(name = "OSE")
private int OSE;
#Column(name = "Envelope")
private int Envelope;
#Column(name = "AccountNumber")
private String AccountNumber;
#Column(name = "DNumber")
private String DNumber;
#Column(name = "LastModified")
private Date LastModified;
#Column(name = "ModifiedBy")
private String ModifiedBy;
private List<Payor> payor;
#OneToMany(mappedBy="Payor", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
#JoinColumn(name="CaseNumber")
public List<Payor> getPayor() {
return payor;
}
public void setPayor(List<Payor> payor) {
this.payor = payor;
}
public String getCaseNumber() {
return CaseNumber;
}
public void setCaseNumber(String caseNumber) {
CaseNumber = caseNumber;
}
public String getFirstname() {
return Firstname;
}
public void setFirstname(String firstname) {
Firstname = firstname;
}
public String getLastname() {
return Lastname;
}
public void setLastname(String lastname) {
Lastname = lastname;
}
public String getMiddlename() {
return Middlename;
}
public void setMiddlename(String middlename) {
Middlename = middlename;
}
public String getAddress1() {
return Address1;
}
public void setAddress1(String address1) {
Address1 = address1;
}
public String getAddress2() {
return Address2;
}
public void setAddress2(String address2) {
Address2 = address2;
}
public String getCity() {
return City;
}
public void setCity(String city) {
City = city;
}
public String getState() {
return State;
}
public void setState(String state) {
State = state;
}
public String getZip() {
return Zip;
}
public void setZip(String zip) {
Zip = zip;
}
public String getHomePhone() {
return HomePhone;
}
public void setHomePhone(String homePhone) {
HomePhone = homePhone;
}
public String getMobilePhone() {
return MobilePhone;
}
public void setMobilePhone(String mobilePhone) {
MobilePhone = mobilePhone;
}
public int getActive() {
return Active;
}
public void setActive(int active) {
Active = active;
}
public String getComments() {
return Comments;
}
public void setComments(String comments) {
Comments = comments;
}
public String getStateCode() {
return StateCode;
}
public void setStateCode(String stateCode) {
StateCode = stateCode;
}
public int getPA() {
return PA;
}
public void setPA(int pA) {
PA = pA;
}
public int getOSE() {
return OSE;
}
public void setOSE(int oSE) {
OSE = oSE;
}
public int getEnvelope() {
return Envelope;
}
public void setEnvelope(int envelope) {
Envelope = envelope;
}
public String getAccountNumber() {
return AccountNumber;
}
public void setAccountNumber(String accountNumber) {
AccountNumber = accountNumber;
}
public String getDNumber() {
return DNumber;
}
public void setDNumber(String dNumber) {
DNumber = dNumber;
}
public Date getLastModified() {
return LastModified;
}
public void setLastModified(Date lastModified) {
LastModified = lastModified;
}
public String getModifiedBy() {
return ModifiedBy;
}
public void setModifiedBy(String modifiedBy) {
ModifiedBy = modifiedBy;
}
}
Payor.java
package com.supportmanager.model;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
#Entity
#Table(name = "payorMaster")
public class Payor implements Serializable {
private static final long serialVersionUID = -1896406931521329889L;
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
#Column(name = "PayorID")
private Integer PayorID;
#Column(name = "CaseNumber")
private String CaseNumber;
#Column(name = "PayorFirstname")
private String PayorFirstname;
#Column(name = "PayorLastname")
private String PayorLastname;
#Column(name = "PayorMiddlename")
private String PayorMiddlename;
#Column(name = "PayorAddress1")
private String PayorAddress1;
#Column(name = "PayorAddress2")
private String PayorAddress2;
#Column(name = "PayorCity")
private String PayorCity;
#Column(name = "PayorState")
private String PayorState;
#Column(name = "PayorZip")
private String PayorZip;
#Column(name = "PayorHomePhone")
private String PayorHomePhone;
#Column(name = "PayorMobilePhone")
private String PayorMobilePhone;
#Column(name = "PayorActive")
private int PayorActive;
#Column(name = "PayorComments")
private String PayorComments;
#ManyToOne
#JoinColumn(name="CaseNumber")
private List<Payee> payee;
public Integer getPayorID() {
return PayorID;
}
public void setPayorID(Integer payorID) {
PayorID = payorID;
}
public String getCaseNumber() {
return CaseNumber;
}
public void setCaseNumber(String caseNumber) {
CaseNumber = caseNumber;
}
public String getPayorFirstname() {
return PayorFirstname;
}
public void setPayorFirstname(String payorFirstname) {
PayorFirstname = payorFirstname;
}
public String getPayorLastname() {
return PayorLastname;
}
public void setPayorLastname(String payorLastname) {
PayorLastname = payorLastname;
}
public String getPayorMiddlename() {
return PayorMiddlename;
}
public void setPayorMiddlename(String payorMiddlename) {
PayorMiddlename = payorMiddlename;
}
public String getPayorAddress1() {
return PayorAddress1;
}
public void setPayorAddress1(String payorAddress1) {
PayorAddress1 = payorAddress1;
}
public String getPayorAddress2() {
return PayorAddress2;
}
public void setPayorAddress2(String payorAddress2) {
PayorAddress2 = payorAddress2;
}
public String getPayorCity() {
return PayorCity;
}
public void setPayorCity(String payorCity) {
PayorCity = payorCity;
}
public String getPayorState() {
return PayorState;
}
public void setPayorState(String payorState) {
PayorState = payorState;
}
public String getPayorZip() {
return PayorZip;
}
public void setPayorZip(String payorZip) {
PayorZip = payorZip;
}
public String getPayorHomePhone() {
return PayorHomePhone;
}
public void setPayorHomePhone(String payorHomePhone) {
PayorHomePhone = payorHomePhone;
}
public String getPayorMobilePhone() {
return PayorMobilePhone;
}
public void setPayorMobilePhone(String payorMobilePhone) {
PayorMobilePhone = payorMobilePhone;
}
public int getPayorActive() {
return PayorActive;
}
public void setPayorActive(int payorActive) {
PayorActive = payorActive;
}
public String getPayorComments() {
return PayorComments;
}
public void setPayorComments(String payorComments) {
PayorComments = payorComments;
}
}
ApplicationContext.xml
....
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.supportmanagement.model" />
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="show_sql">true</prop>
<prop key="enable_lazy_load_no_trans">true</prop>
<prop key="default_schema">SupportManagerDB</prop>
<prop key="format_sql">true</prop>
<prop key="use_sql_comments">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.supportmanagement.model.Payee</value>
<value>com.supportmanagement.model.Payor</value>
</list>
</property>
</bean>
....
In you jsp page you use:
${payee.getPayor().getCaseNumber()}
Now.. getPayor() returns a List<Payor> and a List does not have the getCaseNumber() method.
You can get a certain Payor from the list and then invoke the method:
${payee.payor[index].caseNumber}
Where index is a hardcode value or a variable.

submitting json data through ajax call not working in spring controller

I have an angularjs page, from which I am trying to pass inputs as JSON object to spring controller through ajax call and trying to assign it to a user defined class to save it. But all the values comes as null in the user object. Below is my code.
Controller method code(POST request):
#RequestMapping(method = RequestMethod.POST, value ={"/addEvent"})
#ResponseBody
public void addEvent(#RequestBody final EventsMstr eventsMstr) {
System.out.println("##################### addEvent controller started.");
System.out.println("eventsMstr = " + eventsMstr);//Prints null for all the fields
this.eventsMstrService.addEvent(new EventsMstr());
}
Ajax call:
SaveEvent: function (param) {
var successCallback = null;
var errorCallback = null;
alert("Param "+param.EventTypeId + param.StartDate+param.EndDate+param.Description);//values getting printed
$http({
url: config.InsertEvent,
type: "POST",
data: JSON.stringify(param),
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }
})
.success(function (data, httpStatus, headers) {
successCallback(data, httpStatus, headers);
})
.error(function (httpStatus, headers) {
successCallback(data, httpStatus, headers);
});
return {
success: function (callback) {
successCallback = callback;
return {
error: function (callback) {
errorCallback = callback;
}
}
}
}
},
I have annotated all the fields of my class with #JsonProperty. I am not sure whether I am missing something here. Suggestions greatly appreciated.
Spring servlet configuration:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
<value>application/x-www-form-urlencoded; charset=UTF-8</value>
</list>
</property>
</bean>
JSON data:
var EventItem = {
EventTypeId: $scope.eventTypeId,
StartDate: $scope.startDate,
EndDate: $scope.EndDate,
Description: $scope.EventName
};
Bean class:
package com.ems.business.model;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
//import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
#XmlRootElement(name = "EventsMaster")
//#JsonIgnoreProperties(ignoreUnknown = true)
public class EventsMstr implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long eventTypeId;
private Date startDate;
private Date endDate;
private String description;
public EventsMstr() {
}
public EventsMstr(Long id, Long eventTypeId, Date startDate, Date endDate,
String description) {
this.id = id;
this.eventTypeId = eventTypeId;
this.startDate = startDate;
this.endDate = endDate;
this.description = description;
}
#JsonProperty("ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
#JsonProperty("EventTypeId")
public Long getEventTypeId() {
return eventTypeId;
}
public void setEventTypeId(Long eventTypeId) {
this.eventTypeId = eventTypeId;
}
#JsonProperty("StartDate")
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
#JsonProperty("EndDate")
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
#JsonProperty("Description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
#Override
public String toString() {
return "EventsMstr [id=" + id + ", startDate=" + startDate
+ ", endDate=" + endDate + ", description=" + description
+ "]";
}
}
It was my carelessness which ate my two days. What I did wrong is, instead of annotating the properties, I was annotating the getter methods. Below is the modified object class.
package com.ems.business.model;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
//import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
#XmlRootElement(name = "EventsMaster")
//#JsonIgnoreProperties(ignoreUnknown = true)
public class EventsMstr implements java.io.Serializable {
private static final long serialVersionUID = 1L;
#JsonProperty("ID")
private Long id;
#JsonProperty("EventTypeId")
private Long eventTypeId;
#JsonProperty("StartDate")
private Date startDate;
#JsonProperty("EndDate")
private Date endDate;
#JsonProperty("Description")
private String description;
public EventsMstr() {
}
public EventsMstr(Long id, Long eventTypeId, Date startDate, Date endDate,
String description) {
this.id = id;
this.eventTypeId = eventTypeId;
this.startDate = startDate;
this.endDate = endDate;
this.description = description;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getEventTypeId() {
return eventTypeId;
}
public void setEventTypeId(Long eventTypeId) {
this.eventTypeId = eventTypeId;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
#Override
public String toString() {
return "EventsMstr [id=" + id + ", startDate=" + startDate
+ ", endDate=" + endDate + ", description=" + description
+ "]";
}
}
Also the request mapping should be like below:
#RequestMapping(method = RequestMethod.POST, value ={"/addEvent"},
headers = {"content-type=application/x-www-form-urlencoded; charset=UTF-8"})
public #ResponseBody EventsMstr addEvent(#RequestBody EventsMstr eventsMstr) {
this.eventsMstrService.addEvent(eventsMstr);
return eventsMstr;
}

Getting the error NoSuchMethodError: org.apache.cassandra.thrift.TBinaryProtocol when using Apache Cassandra,Kundera,Spring MVC

I keep getting the message
java.lang.NoSuchMethodError: org.apache.cassandra.thrift.TBinaryProtocol: method <init>(Lorg/apache/thrift/transport/TTransport;)V not found
at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.initiateClient(CassandraSchemaManager.java:446)
at com.impetus.kundera.configure.schema.api.AbstractSchemaManager.exportSchema(AbstractSchemaManager.java:101)
at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.exportSchema(CassandraSchemaManager.java:138)
at com.impetus.kundera.configure.SchemaConfiguration.configure(SchemaConfiguration.java:172)
at com.impetus.kundera.configure.ClientMetadataBuilder.buildClientFactoryMetadata(ClientMetadataBuilder.java:45)
at com.impetus.kundera.persistence.EntityManagerFactoryImpl.configureClientFactories(EntityManagerFactoryImpl.java:352)
at com.impetus.kundera.persistence.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:116)
at com.impetus.kundera.KunderaPersistence.createEntityManagerFactory(KunderaPersistence.java:83)
at com.impetus.kundera.KunderaPersistence.createContainerEntityManagerFactory(KunderaPersistence.java:65)
Whenever I try to run my Java Spring MVC 3.2 Project. I am trying to connect to Apache Cassandra 1.2.8 that I have installed on my machine from the Spring WebApp using Kundera. I have included the following dependencies in the pom.xml file of the project:
scale7-pelops(1.3-1.1.x)
cassandra-all & cassandra-clientutil (1.2.8)
kundera-core & kundera-cassandra (2.6)
My Spring Project uses XML-less configuration (Java Config) and JPA apart from kundera's persistence.xml which is under {PROJECT}/src/main/resources/META-INF so as to be at the base of the classpath during deployment. My persistence.xml looks like:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="cassandra_pu">
<provider>com.impetus.kundera.KunderaPersistence</provider>
<class>org.tutiworks.orm.Role</class>
<class>org.tutiworks.orm.User</class>
<properties>
<property name="kundera.nodes" value="localhost"/>
<property name="kundera.port" value="9160"/>
<property name="kundera.keyspace" value="afrikana"/>
<property name="kundera.dialect" value="cassandra"/>
<property name="kundera.ddl.auto.prepare" value="update"/>
<property name="kundera.client.lookup.class" value="com.impetus.client.cassandra.pelops.PelopsClientFactory" />
<property name="kundera.cache.provider.class" value="com.impetus.kundera.cache.ehcache.EhCacheProvider"/>
<property name="kundera.cache.config.resource" value="/ehcache-cassandra.xml"/>
</properties>
</persistence-unit>
</persistence>
And the configuration class creating the entityManager looks like:
#Configuration
public class SpringDataConfig extends WebMvcConfigurerAdapter{
#Autowired
private Environment env;
#Value("${kundera.nodes}") private String node;
#Value("${kundera.port}") private String port;
#Value("${kundera.keyspace}") private String keyspace;
#Value("${kundera.dialect}") private String dialect;
#Value("${kundera.ddl.auto.prepare}") private String dbGenerator;
#Value("${kundera.cache.provider.class}") private String cacheClass;
#Value("${kundera.client.lookup.class}") private String lookupClass;
#Value("${kundera.cache.config.resource}") private String configResource;
#Value("${persistence.unit.name}") private String persistenceUnitName;
#Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitName(persistenceUnitName);
return em;
}
#Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
The following class shows how the persistence context is used.
public abstract class GenericDAO< T extends Serializable > {
private Class<T> clazz;
#PersistenceContext
EntityManager entityManager;
protected void setClazz( Class<T> clazzToSet ){
this.clazz = clazzToSet;
}
public T findOne( String id ){
return this.entityManager.find( this.clazz, id );
}
#SuppressWarnings("unchecked")
public List< T > findAll(){
return this.entityManager.createQuery( "from " + this.clazz.getName() )
.getResultList();
}
public void save( T entity ){
this.entityManager.persist( entity );
}
public void update( T entity ){
this.entityManager.merge( entity );
}
public void delete( T entity ){
this.entityManager.remove( entity );
}
public void deleteById( String entityId ){
T entity = this.findOne( entityId );
this.delete( entity );
}
}
A sample of the ORM that is mapped to a column family in Apache Cassandra installation looks like the following.
#XmlRootElement(name = "Role")
#Entity(name="Role")
#Table(name = "roles", schema = "afrikana#cassandra_pu")
public class Role implements Serializable {
private static final long serialVersionUID = 9127322651789683331L;
#Id
#Column(name="id")
#XmlID
private String id;
#Column(name = "role_name")
#XmlElement(name = "role_name")
private String roleName;
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Where would I be going wrong with my configuration? What I'm I missing? How do I fix the error?
Kundera cassandra libraries are running on 1.2.4 version. Ideally 1.2.8 or higher versions should always be backward compatible, but in this case unfortunately they are not!

OPEN JPA find() could not retrieve the value of the entity from my Database

There is a weird scenario that I had encountered in my User log in program.
Insert the record.. Userid password etc.
Insert the record using merge();
Then close the IDE (Netbeans)
Open IDE Netbeans then start servers, start database connection.
Open the log in browser.
log in using the inserted record.
My program could not detect the record on the table.
When debugging, after the find() it would not populate my entity.. Maybe there is still another step to populate the entity?
LoginAction
package lotmovement.action;
import com.opensymphony.xwork2.ActionSupport;
import lotmovement.business.crud.RecordExistUserProfile;
import org.apache.commons.lang3.StringUtils;
public class LoginAction extends ActionSupport{
private String userName;
private RecordExistUserProfile recordExistUserProfile;
private String password;
#Override
public void validate(){
if(StringUtils.isEmpty(getUserName())){
addFieldError("userName","Username must not be blanks.");
}
else{
if(!recordExistUserProfile.checkrecordexist(getUserName())){
addFieldError("userName","Username don't exist.");
}
}
if(StringUtils.isEmpty(getPassword())){
addFieldError("password","Password must not be blanks.");
}
else{
if(!recordExistUserProfile.CheckPasswordCorrect(getUserName(), getPassword())){
addFieldError("userName","Password not correct");
}
}
}
public String execute(){
return SUCCESS;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public RecordExistUserProfile getRecordExistUserProfile() {
return recordExistUserProfile;
}
public void setRecordExistUserProfile(RecordExistUserProfile recordExistUserProfile) {
this.recordExistUserProfile = recordExistUserProfile;
}
}
Validator Program
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lotmovement.business.crud;
import lotmovement.business.entity.UserProfile;
/**
*
* #author god-gavedmework
*/
public class RecordExistUserProfile {
private EntityStart entityStart;
private UserProfile userProfile;
public boolean checkrecordexist(String userId) {
entityStart.StartDbaseConnection();
entityStart.em.find(UserProfile.class, userId);
if (userId.equals(userProfile.getUserId())) {
return true;
} else {
return false;
}
}
public boolean CheckPasswordCorrect(String userId, String password) {
entityStart.StartDbaseConnection();
entityStart.em.find(UserProfile.class, userId);
if (password.equals(userProfile.getPassword())) {
return true;
} else {
return false; ---> It will step here.
}
}
public UserProfile getUserProfile() {
return userProfile;
}
public void setUserProfile(UserProfile userProfile) {
this.userProfile = userProfile;
}
public EntityStart getEntityStart() {
return entityStart;
}
public void setEntityStart(EntityStart entityStart) {
this.entityStart = entityStart;
}
}
Entity
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lotmovement.business.entity;
import java.io.Serializable;
import javax.persistence.*;
/**
*
* #author god-gavedmework
*/
#Entity(name = "USERPROFILE") //Name of the entity
public class UserProfile implements Serializable{
#Id //signifies the primary key
#Column(name = "USER_ID", nullable = false,length = 20)
private String userId;
#Column(name = "PASSWORD", nullable = false,length = 20)
private String password;
#Column(name = "FIRST_NAME", nullable = false,length = 20)
private String firstName;
#Column(name = "LAST_NAME", nullable = false,length = 50)
private String lastName;
#Column(name = "SECURITY_LEVEL", nullable = false,length = 4)
private int securityLevel;
#Version
#Column(name = "LAST_UPDATED_TIME")
private java.sql.Timestamp updatedTime;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getSecurityLevel() {
return securityLevel;
}
public void setSecurityLevel(int securityLevel) {
this.securityLevel = securityLevel;
}
public java.sql.Timestamp getUpdatedTime() {
return updatedTime;
}
public void setUpdatedTime(java.sql.Timestamp updatedTime) {
this.updatedTime = updatedTime;
}
}
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lotmovement.business.crud;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import lotmovement.business.entity.UserProfile;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAPersistence;
public class EntityStart {
EntityManagerFactory factory;
EntityManager em;
public void StartDbaseConnection()
{
factory = Persistence.createEntityManagerFactory("LotMovementPU");
em = factory.createEntityManager();
}
public void StartPopulateTransaction(Object entity){
EntityTransaction userTransaction = em.getTransaction();
userTransaction.begin();
em.merge(entity);
userTransaction.commit();
em.close();
}
public void CloseDbaseConnection(){
factory.close();
}
}
Using Trace as adviced, This is the log of the SQL
SELECT t0.LAST_UPDATED_TIME, t0.FIRST_NAME, t0.LAST_NAME, t0.PASSWORD, t0.SECURITY_LEVEL FROM USERPROFILE t0 WHERE t0.USER_ID = ? [params=(String) tok]
This is the record:
USER_ID FIRST_NAME LAST_NAME PASSWORD SECURITY_LEVEL LAST_UPDATED_TIME
tok 1 1 1 1 2012-12-13 08:46:48.802
Added Persistence.XML
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="LotMovementPU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<non-jta-data-source/>
<class>lotmovement.business.entity.UserProfile</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:derby://localhost:1527/LotMovementDBase"/>
<property name="openjpa.ConnectionDriverName" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="openjpa.ConnectionUserName" value="toksis"/>
<property name="openjpa.ConnectionPassword" value="bitoytoksis"/>
<property name="openjpa.Log" value="SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
</properties>
</persistence-unit>
</persistence>
I discovered the root cause of the problem. It is on how I instantiate the class in Spring Plugin.
When I change the find() statement to below, it will now work.
UserProfile up = entityStart.em.find(UserProfile.class, "tok");
But how can i initialize this one using Spring? codes below dont work?
private UserProfile userProfile;
...... some codes here.
entityStart.em.find(UserProfile.class, userId);
..... getter setter
The Root cause of the problem.
entityStart.em.find(UserProfile.class, userId); --> it should be
userProfile = entityStart.em.find(UserProfile.class, userId);

Resources