Связывание существующих объектов с помощью Spring MVC - PullRequest
0 голосов
/ 17 апреля 2019

Я работаю над приложением рейтинга пива, используя Spring MVC и Hibernate. Я пытаюсь взять пиво (расположенное в таблице MySQL с надписью beer) из выпадающего списка и сохранить его в рейтинге. Я могу заставить работать раскрывающийся список, но когда я сохраняю рейтинг, идентификатор пива не сохраняется должным образом в моей таблице рейтинга в базе данных. Кроме того, название пива не возвращается для моего рейтинга в моем приложении.

Я пытаюсь сопоставить один в один, но по какой-то причине beerId автоматически увеличивается. Я знаю, что установил @GeneratedValue(strategy=GenerationType.IDENTITY) для сущности Beer, но если я этого не сделаю, приложение взорвется.

Кроме того, учитывая то, что я заставляю это работать, я испытываю трудности с перекрестными ссылками на название пива на странице list-ratings.jsp, поскольку имя пива хранится в таблице пива, а не в таблице рейтингов.

BeerController.java

@Controller
@RequestMapping("/beers")
public class BeerController {

    @Autowired
    private BeerService beerService;

    @GetMapping("/list")
    public String listBeers(Model theModel) {

        List<Beer> theBeers = beerService.getBeers();

        theModel.addAttribute("beers", theBeers);

        return "list-beers";
    }

    @GetMapping("/details")
    public String beerDetails(@RequestParam("beerId") int theId,
                                    Model theModel) {

        Beer theBeer = beerService.getBeer(theId);

        theModel.addAttribute("beer", theBeer);

        return "beer-details";
    }

    //searchBeers()method
}

RatingController.java

@Controller
@RequestMapping("/ratings")
public class RatingController {

    @Autowired
    private RatingService ratingService;

    @Autowired
    private BeerService beerService;

    @GetMapping("/list")
    public String listRatings(Model theModel) {

        List<Rating> theRatings = ratingService.getRatings();
        List<Beer> theBeers = beerService.getBeers();

        theModel.addAttribute("ratings", theRatings);
        theModel.addAttribute("beers", theBeers);

        return "list-ratings";
    }

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

        Rating theRating = new  Rating();
        List<Beer> theBeers = beerService.getBeers();

        theModel.addAttribute("rating", theRating);

        theModel.addAttribute("beers", theBeers);

        return "rating-form";
    }
    @PostMapping("/saveRating")
    public String saveRating(
            @Valid @ModelAttribute("rating") Rating theRating,
            BindingResult theBindingResult) {

        if (theBindingResult.hasErrors()){
            return "rating-form";
        }
        else {
            ratingService.saveRating(theRating);
            return "redirect:/ratings/list";
        }

    }
}

Оценка-form.jsp

<form:form action="saveRating" modelAttribute="rating" method="POST">
    <!-- need to associate this data with rating id -->
    <form:hidden path="id" />
    <table>
        <tbody>
            <tr>
                <td><form:label path="beer.beerId">Beer:</form:label></td>
                <td><form:select path="beer.beerId" cssStyle="width: 150px;">
                        <option value="-1">Select a beer</option>
                        <c:forEach var="beer" items="${beers}">
                            <option value="${beer.beerId}">${beer.beerName}</option>
                        </c:forEach>
                    </form:select></td>
            </tr>
            <tr>
                <td><label>Rating:</label></td>
                <td><form:input path="rating"
                        placeholder="Please enter a rating from 1-5" /></td>
                <form:errors path="rating" cssClass="error" element="div" />
            </tr>
            <tr>
                <td><label>Tasting Notes:</label></td>
                <td><form:input path="tastingNotes" /></td>
            </tr>
            <tr>
                <td><label></label></td>
                <td><input type="submit" value="Save" class="save" /></td>
            </tr>
        </tbody>
    </table>
</form:form>

список-beers.jsp

<form:form action="search" method="GET">
    Search beer: <input type="text" name="theSearchName" />

    <input type="submit" value="Search" class="add-button" />
</form:form>
<table>
    <tr>
        <th>Name</th>
        <th>Brewery</th>
        <th>Type</th>
        <th>ABV</th>
        <th>Details</th>
    </tr>
    <c:forEach var="tempBeer" items="${beers}">

        <c:url var="detailsLink" value="/beers/details">
            <c:param name="beerId" value="${tempBeer.beerId}" />
        </c:url>
        <tr>
            <td> ${tempBeer.beerName} </td>
            <td> ${tempBeer.brewery} </td>
            <td> ${tempBeer.type} </td>
            <td> ${tempBeer.abv} </td>

            <td>
                <a href="${detailsLink}">Details</a>
            </td>
        </tr>
    </c:forEach>
</table>

список-ratings.jsp

<div id="container">
    <div id="content">

        <input type="button" value="Add Rating" 
            onclick="window.location.href='showFormForAdd'; return false"
            class="add-button"
        />

        <!--  add a search box -->
        <form:form action="search" method="GET">
            Search rating: <input type="text" name="theSearchName" />

            <input type="submit" value="Search" class="add-button" />
        </form:form>

        <!-- add our html table here -->
        <table>
            <tr>
                <th>Beer</th>
                <th>Rating</th>
                <th>Tasting Notes</th>
                <th>Date</th>
                <th>Action</th>
            </tr>
            <!-- loop over and print our ratings -->
            <c:forEach var="tempRating" items="${ratings}">
                <tr>
                    <td> ${tempRating.beer} </td>
                    <td> ${tempRating.rating} </td>
                    <td> ${tempRating.tastingNotes} </td>
                    <td> ${tempRating.date} </td>
                </tr>
            </c:forEach>
        </table>

    </div>

</div>
<p>
    <a href="${pageContext.request.contextPath}/ratings/showFormForAdd">Submit a New Rating</a>
</p>

Beer.java

@Entity
@Table(name="beer")
public class Beer {

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

    //Other field mappings

    public Beer(){

    }

    //Getter and Setter Methods

Rating.java

@Entity
@Table(name="ratings")
public class Rating {

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

    @OneToOne
    @JoinColumn(name="beer_id")
    private Beer beer;

    //other field mappings

    public Rating() {

    }

    //Getter and Setter Methods

BeerDAOImpl.java

@Repository
public class BeerDAOImpl implements BeerDAO {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void addBeer(Beer beer) {
     sessionFactory.getCurrentSession().saveOrUpdate(beer);
    }

    //getBeers() method
    //getBeer() method    
}

RatingDAOImpl.java

@Repository
public class RatingDAOImpl implements RatingDAO {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public List<Rating> getRatings() {

        Session currentSession = sessionFactory.getCurrentSession();

        Query<Rating> theQuery = currentSession.createQuery("from Rating order by beer", Rating.class);

        List<Rating> ratings = theQuery.getResultList();

        return ratings;
    }

    @Override
    public void saveRating(Rating theRating) {

        Session currentSession = sessionFactory.getCurrentSession();

        currentSession.saveOrUpdate(theRating);

    }

    @Override
    public Rating getRating(int theId) {

        Session currentSession = sessionFactory.getCurrentSession();

        Rating theRating = currentSession.get(Rating.class, theId);

        return theRating;
    }

    //deleteRating() method
    //searchRatings() method
}

BeerServiceImpl.java

@Service("beerService")
@Transactional (propagation=Propagation.SUPPORTS, readOnly=true)
public class BeerServiceImpl implements BeerService {

    @Autowired
    private BeerDAO beerDAO;

    @Override
    @Transactional
    public List<Beer> getBeers() {
        return beerDAO.getBeers();
    }

    @Override
    @Transactional
    public Beer getBeer(int theId) {

        return beerDAO.getBeer(theId);
    }

    @Override
    @Transactional
    public List<Beer> searchBeers(String theSearchName) {
        return beerDAO.searchBeers(theSearchName);
    }
}

RatingServiceImpl.java

@Service
public class RatingServiceImpl implements RatingService {

    @Autowired
    private RatingDAO ratingDAO;

    @Override
    @Transactional
    public List<Rating> getRatings() {
        return ratingDAO.getRatings();
    }

    @Override
    @Transactional
    public void saveRating(Rating theRating) {

        ratingDAO.saveRating(theRating);

    }

    @Override
    @Transactional
    public Rating getRating(int theId) {
        return ratingDAO.getRating(theId);
    }

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