Как поместить новую сущность в базу данных, используя hibernate / spring с отношениями ManyToOne и OneToMany - PullRequest
0 голосов
/ 03 февраля 2019

Я работаю над новым простым приложением, которое будет хранить пользователей и их транзакции с категориями.Я пытаюсь ввести новую транзакцию в моей базе данных MySQL, но я не уверен, как это сделать.Я думал о выборе пользователя и категории из списка для каждой новой транзакции, затем вы указали сумму, дату и описание транзакции и сохранили их в базе данных.Я застрял в момент, когда у меня есть список категорий и пользователей в базе данных.Я также немного переживаю, если мой проанализированный формат даты правильно конвертирован и готов для помещения в базу данных mysql.

Вот мой объект транзакции:

@Entity
@Table(name = "transaction")
@NamedQueries({
    @NamedQuery(name="get_all_transactions", query = "select transaction 
from Transaction transaction")
})
public class Transaction {

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_category")
private Category category;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_user")
private User user;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_transaction")
private int transactionId;

@Column(name = "amount")
private BigDecimal moneyAmount;

@Column(name = "flow_date")
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern="dd.MM.yyyy")
private Date transactionDate;

@Column(name = "description")
private String description;

public Transaction(){}

public Transaction(BigDecimal moneyAmount, Date transactionDate, String 
description) {
    this.moneyAmount = moneyAmount;
    this.transactionDate = transactionDate;
    this.description = description;
} 

Контроллер транзакций:

@Controller
@RequestMapping("/transaction")
public class TransactionController {

@Autowired
DatabaseService databaseService;

@PersistenceContext
EntityManager em;

@GetMapping("/addTransaction")
public String transactionsList(Model theModel){
    Transaction transaction = new Transaction();
    List<Category> categories = 
em.createNamedQuery("get_all_categories").getResultList();
    List<User> users = 
 em.createNamedQuery("get_all_users").getResultList();
    theModel.addAttribute("transaction", transaction);
    theModel.addAttribute("categoriesList",categories);
    theModel.addAttribute("usersList",users);
    return "addTransaction";
}

@PostMapping("/saveTransaction")
public String saveTransaction(@ModelAttribute("transaction") Transaction 
newTransaction, BindingResult theBindingResult){
    databaseService.saveTransaction(newTransaction);
    return "transactionProcessForm";
}

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat formattedDate = new SimpleDateFormat("yyyy-MM-dd");
    formattedDate.setLenient(true);
    binder.registerCustomEditor(Date.class, new 
CustomDateEditor(formattedDate, true));
}
}

addTransaction.jsp:

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Add Transaction Form</title>
</head>
<body>

    <h1>Add transaction to database:</h1>

    <form:form action="saveTransaction" modelAttribute="transaction" 
method="post">

<table>
<tr>
    <td><label>Choose user:</label></td>
    <td><select>
        <c:forEach items="${usersList}" var="user">
            <option name="id" value="${user.id}">${user.login}
            </option>
        </c:forEach>
    </select>
</tr>

<tr>
    <td><label>Choose category:</label></td>
    <td><select>
        <c:forEach items="${categoriesList}" var="category">
            <option name="id" 
value="${category.id}">${category.categoryName}</option>
        </c:forEach>
    </select>
</tr>
        <tr>
            <td><label>Amount:</label></td>
            <td><form:input path="moneyAmount" />
            </td>
        </tr>

        <tr>
            <td><label>Transaction date:</label></td>
            <td><form:input type = "date" path="transactionDate"/>  <%-- 
pattern="dd-MM-yyyy"--%>
            </td>
        </tr>

        <tr>
            <td><label>Description:</label></td>
            <td><form:input path="description" />
            </td>
        </tr>

        <tr>
            <label></label>
            <td><input type="submit" value="Submit" class="save"/>
            </td>
        </tr>
</table>
    </form:form>

</body>
</html>

Было бы здорово, если бы вы могли проверить мой TransactionDAO, я думаю, что это нормально, но могут быть некоторые ошибки:

@Repository
public class TransactionRepository {



@PersistenceContext
private EntityManager entityManager;

public List<Transaction> getTransactionsList(){
    return 
entityManager.createNamedQuery("get_all_transactions").getResultList();
}

public Transaction getSingleTransactionById(int transactionIdToFind){
    return entityManager.find(Transaction.class, transactionIdToFind);
}

public Transaction getTransactionByDate(Date dateToFind){
    return entityManager.createQuery(
            "select t from Transaction t where 
t.transactionDate=:date",Transaction.class)
            .setParameter("date",dateToFind).getSingleResult();
}

public void deleteTransactionById(int transactionToDeleteId){
    Transaction transactionToDelete = 
getSingleTransactionById(transactionToDeleteId);
    entityManager.remove(transactionToDelete);
}

public void saveTransaction(Transaction transactionToSave){
    if(transactionToSave.getTransactionId() == 0){
        entityManager.persist(transactionToSave);
    }else {
        entityManager.merge(transactionToSave);
    }
}

}

Вот ссылка для моего скриншота отношений sql: https://imgur.com/a/d9XMOKa

А вот для вывода localhost (как выглядит страница): https://imgur.com/a/Sqge0ZQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...