Я работаю над приложением рейтинга пива, используя 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
}