• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyświetlenie historii przelewów, zły typ danych

Object Storage Arubacloud
0 głosów
278 wizyt
pytanie zadane 25 października 2018 w Java przez Przemyslaw Użytkownik (610 p.)

Cześć! Tworzę aplikację bankową, której jedną z funkcjonalności jest wyświetlanie historii przelewów klienta.

Aplikację wykonuję przy pomocy Springa oraz Hibernate'a.

Historię chcę wyświetlić w postaci listy. 

Poniżej przedstawiam kod, a w komentarzu dodam błąd(zbyt duża liczba znaków)

View: 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<!DOCTYPE html>

<html>

<head>
	<title>List Customers</title>

	<link rel="stylesheet"
		  href="<c:url value="/resources/css/styles.css" />" >

	<link rel="stylesheet"
		  href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>

	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

	<meta http-equiv="refresh" content="<%=session.getMaxInactiveInterval()%>;url=showMyLoginPage"/>
</head>

<body>

	<nav class="navbar navbar-default">
		<div class="container-fluid">
		  <div class="navbar-header">
			<a class="navbar-brand" href="#">
			  <span id="logo">CP</span>
			</a>
		  </div>
		  <div class="title">
			<h3>Client Panel</h3>
			<form:form action="${pageContext.request.contextPath}/logout" 
					   method="POST"
					   id="logout">
                <div id="clockdiv"></div>
	 			<input type="submit" value="Logout" class="btn btn-secondary btn-sm"/>
			</form:form>
		  </div>
		</div>
	  </nav>
		
		<!-- new button: -->
		<div class="col-xs-3 sidebar">
			<div class="sidebar-container">
				<input type="button" value="Make Transfer"
					onclick="window.location.href='makeTransfer'; return false;"
					class="btn btn-primary"
				/>
			</div>
		</div>
		<div class="col-xs-9 main">	
			<!--  add a search box -->
	
		
		<div class="table-container">

			<div class="panel panel-default">
				<!-- Default panel contents -->
				<div class="panel-heading">Panel heading</div>
				
				<!-- Table -->
				<table class="table">
						<tr>
							<th>Amount</th>
							<th>Account Number Sender</th>
						</tr>
						
						<!-- loop over customers -->
						<c:forEach var="tempOrderItems" items="${orderItems}">
						
						<tr>
							<td>${tempOrderItems.amount}</td>
							<td>${tempOrderItems.accountNumberSender}</td>
						</tr>
						</c:forEach>
					</table>
			</div>

		</div>

		</div>
	<script src="<c:url value="/resources/javaScript/logoutTimer.js" />"></script>
</body>

</html>

Controller:

package main.com.java.controller;

import java.util.ArrayList;
import java.util.List;

import main.com.java.service.business.objectUtils.OrderItemFilter;
import main.com.java.service.domain.interfaces.AccountService;
import main.com.java.service.domain.interfaces.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import main.com.java.entity.Account;
import main.com.java.entity.Customer;
import main.com.java.entity.OrderItem;
import main.com.java.service.domain.interfaces.OrderItemService;

@Controller
@RequestMapping("/user")
public class OrderItemController {

    private OrderItemService orderItemService;
    private UsersService usersService;
    private AccountService accountService;

    @Autowired
    public OrderItemController(OrderItemService orderItemService, UsersService usersService, AccountService accountService) {
        this.orderItemService = orderItemService;
        this.usersService = usersService;
        this.accountService = accountService;
    }

    @GetMapping("/makeTransfer")
    public String makeTransfer(Model theModel) {

        OrderItem theOrderItem = new OrderItem();

        theModel.addAttribute("orderitem", theOrderItem);

        return "transfer-form";
    }

    @PostMapping("/saveTransfer")
    public String saveTransfer(@ModelAttribute("orderitem") OrderItem theOrderItem,
                               @ModelAttribute("account") Account account,
                               @RequestParam("accountNumberSender") String Send,
                               @RequestParam("accountNumberReceiver") String Rec,
                               @RequestParam("amount") long amount) {
        orderItemService.saveTransfer(theOrderItem, account, Send, Rec, amount);
        return "redirect:/user/panel";
    }

    @RequestMapping("/panel")
    public String listCustomers(Model theModel) {
        OrderItemFilter orderItemFilter = new OrderItemFilter(usersService, orderItemService, accountService);
        List<OrderItem> theOrderItems = orderItemFilter.getSenderOrderItem();
        theModel.addAttribute("orderItems", theOrderItems);
        return "indexUser";
    }


}

 

OrderItemFiler.getSenderOrderItem():

public List<OrderItem> getSenderOrderItem(){
        try{
            return orderItemService.getOrderItemListSender(getAccountNumber());
        }catch (NullPointerException e){
            e.printStackTrace();
            List<OrderItem> emptyList = new ArrayList<>();
            emptyList.add(new OrderItem(0L,"-","-"));
            return orderItemService.getOrderItems();
        }
    }

 

getOrderItemListSender():

    @Override
	@Transactional
    public List<OrderItem> getOrderItemListSender(String accountNumberSenderValue) {
        String hql = "FROM OrderItem WHERE accountNumberSender=:accountNumberSenderParam";
        Query theQuery = createCurrentSession(sessionFactory).createQuery(hql);
        theQuery.setParameter("accountNumberSenderParam", accountNumberSenderValue);
        System.out.println(theQuery.list());
        return theQuery.list();

    }

 

OrderItemDTO:
 

@Entity
@Table(name="orderitem")
public class OrderItem {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="orderItemID")
	private long orderItemID;
	
	@Column(name="amount")
	private long amount;
	
	@Column(name="accountNumberSender")
	private String accountNumberSender;
	
	@Column(name="accountNumberReceiver")
	private String accountNumberReceiver;
	
	@ManyToOne
    @JoinColumn(name="accountNumberSender", insertable = false, updatable = false)
    private Account senderAccount;

    @ManyToOne
    @JoinColumn(name="accountNumberReceiver", insertable = false, updatable = false)
    private Account receiverAccount;

	public OrderItem() {}
	
	public OrderItem(long amount, String accountNumberSender, String accountNumberReceiver) {
		this.amount = amount;
		this.accountNumberSender = accountNumberSender;
		this.accountNumberReceiver = accountNumberReceiver;
	}
	
	
	public Account getSenderAccount() {
		return senderAccount;
	}

	public Account getReceiverAccount() {
		return receiverAccount;
	}

	public void setSenderAccount(Account senderAccount) {
		this.senderAccount = senderAccount;
	}

	public void setReceiverAccount(Account receiverAccount) {
		this.receiverAccount = receiverAccount;
	}

	public long getOrderItemID() {
		return orderItemID;
	}
	public void setOrderItemID(long orderItemID) {
		this.orderItemID = orderItemID;
	}
	public long getAmount() {
		return amount;
	}
	public void setAmount(long amount) {
		this.amount = amount;
	}
	public String getAccountNumberSender() {
		return accountNumberSender;
	}
	public void setAccountNumberSender(String accountNumberSender) {
		this.accountNumberSender = accountNumberSender;
	}
	public String getAccountNumberReceiver() {
		return accountNumberReceiver;
	}
	public void setAccountNumberReceiver(String accountNumberReceiver) {
		this.accountNumberReceiver = accountNumberReceiver;
	}

	
}

Tabela orderitem:

CREATE TABLE IF NOT EXISTS `bank_application`.`orderitem` (
  `orderItemID` BIGINT(8) NOT NULL AUTO_INCREMENT,
  `amount` BIGINT(7) NOT NULL,
  `accountNumberSender` VARCHAR(26) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL,
  `accountNumberReceiver` VARCHAR(26) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL,
  PRIMARY KEY (`orderItemID`),
  INDEX `accountNumberSender` (`accountNumberSender` ASC),
  INDEX `accountNumberReceiver` (`accountNumberReceiver` ASC),
  CONSTRAINT `OrderItem_ibfk_1`
    FOREIGN KEY (`accountNumberSender`)
    REFERENCES `bank_application`.`account` (`accountNumber`)
    ON UPDATE CASCADE,
  CONSTRAINT `OrderItem_ibfk_2`
    FOREIGN KEY (`accountNumberReceiver`)
    REFERENCES `bank_application`.`account` (`accountNumber`)
    ON UPDATE CASCADE)
ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;

 

komentarz 25 października 2018 przez Przemyslaw Użytkownik (610 p.)
25-Oct-2018 21:26:54.411 SEVERE [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not execute query] with root cause
 com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: '14128533212703682818813699' in column '2' is outside valid range for the datatype BIGINT.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
	at com.mysql.jdbc.ResultSetImpl.throwRangeException(ResultSetImpl.java:7061)
	at com.mysql.jdbc.ResultSetImpl.parseLongAsDouble(ResultSetImpl.java:6381)
	at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2685)
	at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2653)
	at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2738)
	at com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:477)
	at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:63)
	at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
	at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:333)
	at org.hibernate.type.ManyToOneType.hydrate(ManyToOneType.java:160)
	at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2854)
	at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1747)
	at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1673)
	at org.hibernate.loader.Loader.getRow(Loader.java:1562)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:732)
	at org.hibernate.loader.Loader.processResultSet(Loader.java:991)
	at org.hibernate.loader.Loader.doQuery(Loader.java:949)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
	at org.hibernate.loader.Loader.doList(Loader.java:2692)
	at org.hibernate.loader.Loader.doList(Loader.java:2675)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
	at org.hibernate.loader.Loader.list(Loader.java:2502)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392)
	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1489)
	at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445)
	at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
	at main.com.java.dao.implementation.OrderItemDAOImpl.getOrderItemListSender(OrderItemDAOImpl.java:49)
	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:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:338)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at com.sun.proxy.$Proxy45.getOrderItemListSender(Unknown Source)
	at main.com.java.service.domain.implementation.OrderItemServiceImpl.getOrderItemListSender(OrderItemServiceImpl.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:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:338)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:206)
	at com.sun.proxy.$Proxy47.getOrderItemListSender(Unknown Source)
	at main.com.java.service.business.objectUtils.OrderItemFilter.getSenderOrderItem(OrderItemFilter.java:30)
	at main.com.java.controller.OrderItemController.listCustomers(OrderItemController.java:63)
	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:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

 

Czemu rzuca mi błąd o BIGINT, kiedy mam to zadeklarowane jako String?

1 odpowiedź

+1 głos
odpowiedź 25 października 2018 przez mbabane Szeryf (79,280 p.)
Wygląda jakbyś wychodził poza zakres typu BIGINT.
komentarz 25 października 2018 przez Przemyslaw Użytkownik (610 p.)
Zgadza się. Jednak tę wartość która jest podana, przechowuję na Stringach,  na bazie na VARCHAR(26)

Dodam, że na bazie wartość jest prawidłowo zapisana.
komentarz 26 października 2018 przez mbabane Szeryf (79,280 p.)

Pokaż: OrderItemDAOImpl

I jedna uwaga do getSenderOrderItem. To:

List<OrderItem> emptyList = new ArrayList<>();
emptyList.add(new OrderItem(0L,"-","-"));
return orderItemService.getOrderItems(); 

robi się tak:

return Collections.emptyList();

I w sumie łapiesz nullPointera co też według mnie jest troszkę brzydko pachnące.

komentarz 26 października 2018 przez Przemyslaw Użytkownik (610 p.)
Podrzucę kod, jak wrócę z pracy.

Pytanie: Czemu nie powinienem łapać NullPointera?
komentarz 26 października 2018 przez mbabane Szeryf (79,280 p.)
Bo tak na prawdę nie wiadomo co łapiesz, NullPointer jest bardzo ogólny i nie do końca wiadomo o co może chodzić. Jeśli coś zwraca listę i ewentualnie to coś może zwrócić nic (np. wyszukiwanie może zwrócić nic) to lepiej zwracać pustą listę, a nulami zająć się w możliwie najniższej warstwie.
komentarz 26 października 2018 przez Przemyslaw Użytkownik (610 p.)

Całe OrderItemDaoImpl:

package main.com.java.dao.implementation;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import main.com.java.dao.interfaces.OrderItemDAO;
import main.com.java.entity.Account;
import main.com.java.entity.Customer;
import main.com.java.entity.OrderItem;

@Repository
public class OrderItemDAOImpl implements OrderItemDAO{

	private final SessionFactory sessionFactory;

	@Autowired
	public OrderItemDAOImpl(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Transactional
	@Override
	public Session createCurrentSession(SessionFactory sf){
		Session session = sf.getCurrentSession();

		return session;
	}

	@Override
	public List<OrderItem> getOrderItemList() {
		Query<OrderItem> theQuery = createCurrentSession(sessionFactory).createQuery("from OrderItem", OrderItem.class);
		List<OrderItem> orderItemsList = theQuery.getResultList();

		return orderItemsList;
	}

    @Override
	@Transactional
    public List<OrderItem> getOrderItemListSender(String accountNumberSenderValue) {
        String hql = "FROM OrderItem WHERE accountNumberSender=:accountNumberSenderParam";
        Query theQuery = createCurrentSession(sessionFactory).createQuery(hql);
        theQuery.setParameter("accountNumberSenderParam", accountNumberSenderValue);
        System.out.println(theQuery.list());
        return theQuery.list();

    }


    @Override
    public List<OrderItem> getOrderItemListReceiver(String accountNumberReceiverValue) {
        String hql = "FROM OrderItem WHERE accountNumberReceiver=:accountNumberReceiverParam";
        Query theQuery = createCurrentSession(sessionFactory).createQuery(hql);
        theQuery.setParameter("accountNumberReceiverParam", accountNumberReceiverValue);
        return theQuery.list();
    }

	@Override
	public OrderItem getOrderItemById(int id) {
		try {			
			return createCurrentSession(sessionFactory).get(OrderItem.class, id);		
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	@Transactional
	public void addOrderItem(OrderItem theOrderItem) {
		try {
			createCurrentSession(sessionFactory).save(theOrderItem);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}

	@Override
	public void deleteOrderItem(OrderItem theOrderItem) {
		try {
			createCurrentSession(sessionFactory).remove(theOrderItem);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void updateOrderItem(OrderItem theOrderItem) {
		try {
			createCurrentSession(sessionFactory).update(theOrderItem);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void saveTransfer(OrderItem theOrderItem, Account account, String Send, String Rec, long amount) {

		// get hibernate session
		Session currentSession = sessionFactory.getCurrentSession();
		
//		Query query1 = currentSession.createQuery("UPDATE account SET balance = 999999 where accountNumber= :Send");
//		query1.setParameter("Send", Send);
//		query1.executeUpdate();
//		Query query2 = currentSession.createQuery("UPDATE account SET balance = 999999 where accountNumber= :Rec");
//		query2.setParameter("Rec", Rec);
//		query2.executeUpdate();
		
		String dbQuery = "UPDATE Account SET balance = balance - :amount where accountNumber= :Send";
		Query q1 =  currentSession.createQuery(dbQuery).setParameter("Send", Send).setParameter("amount", amount);
		
		String dbQuery2 = "UPDATE Account SET balance = balance + :amount1 where accountNumber= :Rec";
		Query q2 =  currentSession.createQuery(dbQuery2).setParameter("Rec", Rec).setParameter("amount1", amount);
		int result = q1.executeUpdate();
		int result2 = q2.executeUpdate();
		
		//save the orderItem 
		currentSession.save(theOrderItem);
		
	}



}

 

komentarz 27 października 2018 przez mbabane Szeryf (79,280 p.)
List<OrderItem> getOrderItemListReceiver(String accountNumberReceiverValue)

Czy ta metoda również powoduje podobny błąd? Bo w zasadzie jest identyczna.

komentarz 27 października 2018 przez Przemyslaw Użytkownik (610 p.)
Jej akurat nie próbowałem. Docelowo ma ona uzupełniać tabelę poniżej.

Podział historii przelewów na przychodzące i wychodzące.
komentarz 27 października 2018 przez mbabane Szeryf (79,280 p.)

Co zauważyłem to tabela orderitem posiada o ile dobrze widzę 4 pola, a klasa na którą ma być zmapowoana ma pól 6. (Chyba, że czegoś nie wiem z dziedziny JPA).

A pokaż jakie masz konkretnie wartości w tej tabeli.

komentarz 27 października 2018 przez Przemyslaw Użytkownik (610 p.)

Służy to do stworzenia relacji pomiędzy Users a Account.

Oto wartości.

Zauważyłem że aplikacja wyrzuca w tym momencie:

    public List<OrderItem> getOrderItemListSender(String accountNumberSenderValue) {
        String hql = "FROM OrderItem WHERE accountNumberSender=:accountNumberSenderParam";
        Query theQuery = createCurrentSession(sessionFactory).createQuery(hql);
        theQuery.setParameter("accountNumberSenderParam", accountNumberSenderValue);
        return theQuery.getResultList();
        
    }

 

Dokładnie na linijce:

        return theQuery.getResultList();

Zmieniłem metodę na: 

    public List<OrderItem> getOrderItemListSender(String accountNumberSenderValue) {
        String hql = "FROM OrderItem WHERE accountNumberSender=:accountNumberSenderParam";
        Query theQuery = createCurrentSession(sessionFactory).createQuery(hql);
        theQuery.setParameter("accountNumberSenderParam", accountNumberSenderValue);
        List resultList = theQuery.getResultList();
        return resultList;

    }

I problem występuje przy zapisaniu do zmiennej wykonania metody getResultList()

1
komentarz 27 października 2018 przez mbabane Szeryf (79,280 p.)
edycja 27 października 2018 przez mbabane

Tworzenie relacji w JPA jest trochę inne niż to czysto bazodanowe.

Mając takie dwie encje:

@Entity
class Account
{
  @Id
  Long id;
       
  String name;
  //...
}

@Entity
class Transaction
{
  @Id
  Long id;
      
  @ManyToOne
  Account account;
  //...
}

Tabele bazy danych będą wyglądały mniej więcej:

Account
id bigint(20),
name varchar(255)

Transaction
id bigint(20)
account bigint(20) references Account (id).

Więc według mnie prawdopodobnie trzeba pozbyć się z klasy OrderItem pól:

@Column(name="accountNumberSender")
private String accountNumberSender;
     
@Column(name="accountNumberReceiver")
private String accountNumberReceiver;

ponieważ te pola masz od razu mapowane na obiekt Account. Ja bym w tę stronę poszedł szukając rozwiązania do tego problemu.

komentarz 27 października 2018 przez Przemyslaw Użytkownik (610 p.)
hmmm no to byłoby dziwne.

Po wyrzuceniu tego, mam problem z dispatcherem.

Aczkolwiek, wszędzie robię te mapowania, we wszystkich innych encjach i to działa. Dodatkowo IDE wykrywa mi to jako wiązanie.
komentarz 27 października 2018 przez Przemyslaw Użytkownik (610 p.)
Dobra, usunąłem też to mapowanie w tym drugim obiekcie.

Iiii... zadziałało.

Teraz już zgłupiałem. Czemu w takim razie w innych encjach, mam te mapowania i jak ich nie miałem, to mi rzucało błąd, a w tym wypadku działało to na szkodę?
komentarz 27 października 2018 przez mbabane Szeryf (79,280 p.)

A jakie dokładnie inne operacje robiłeś?

Aha i jeszcze jedna uwaga techniczna. Do pól encji które mają być kluczem głównym nie stosuj prostego typu long tylko obiektowego Long,. Prymitywy domyślnie inicjalizowane są wartością 0 czyli de-facto jest to jakaś wartość, która może coś sugerować. Natomiast obiektowy typ Long przy inicjalizacji będzie nullem czyli pusty - nie będzie na nic wskazywał:

class WithPrimitiveLong
{
    private long field;

    public long getField()
    {
        return field;
    }
}

class WithObjectiveLong
{
    private Long field;

    public Long getField()
    {
        return field;
    }
}

Przykład użycia:

WithPrimitiveLong primitiveLong = new WithPrimitiveLong();
System.out.println(primitiveLong.getField());

WithObjectiveLong objectiveLong = new WithObjectiveLong();
System.out.println(objectiveLong.getField());

Wyjście:

0
null
komentarz 27 października 2018 przez Przemyslaw Użytkownik (610 p.)
Każda operacja, typu tworzenie konta, użytkownika etc. jest oparta na relacji.

Dziękuję za dobrą radę. Ale nasuwa mi się pytanie, co jest w tym złego że w początkowej inicjalizacji wystąpi 0 zamiast nulla? W tej sytuacji ta wartość i tak jest automatycznie generowana.
1
komentarz 27 października 2018 przez mbabane Szeryf (79,280 p.)

Każda operacja, typu tworzenie konta, użytkownika etc. jest oparta na relacji. 

Tutaj trzeba by się trochę zagłębić w działanie JPA i implementacji czego za bardzo się nie podejmę. Można tylko się domyślać/zgadywać, że to jakoś sobie poradziło z wstawieniem danych. Mogę tylko dopytać jak dokładnie tworzony był obiekt OrderItem do zapisu, bo jeśli pominąłeś, któreś z pól podczas zapisu to być może dlatego działało.

Jeśli chodzi o ten long vs Long to własnie chodzi o to, że null to wartość pusta, która nie jest utrwalona w bazie, natomiast 0 może już istnieć w bazie i może wystąpić problem z ustaleniem czy dana wartość jest nowa, czy już istnieje w bazie. null jest jakby bardziej czytelny i od razu sugeruje, że czegoś nie ma.

 

Podobne pytania

0 głosów
1 odpowiedź 1,907 wizyt
pytanie zadane 10 grudnia 2022 w Java przez letmestay Użytkownik (520 p.)
0 głosów
1 odpowiedź 812 wizyt
0 głosów
1 odpowiedź 4,013 wizyt
pytanie zadane 13 października 2016 w Java przez nemezisso Użytkownik (860 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...