2016-04-21 10 views
1

私は2つのテーブルを持っています - FoodとLvl。すべてのLvlに多くの食品を保管することができます。Spring Hibernate JSP - レコードを保存しようとすると、外部キーがnullです。

LVLクラス

@SequenceGenerator(name = "lvl_seq", sequenceName = "lvl_seq") 
@Entity 
@Table(name = "Lvl") 
public class Lvl { 
    @Id 
    @GeneratedValue(generator = "lvl_seq") 
    @Column(name = "lvl_id") 
    private int lvl_id; 
    @Column(name = "dimension") 
    private String dimension; 
    @Column(name = "title") 
    private String title; 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "lvl_id") 
    private List<Food> foodList; 
    //getset 
    public int getLvl_id() { return lvl_id; } 
    public void setLvl_id(int lvl_id) { this.lvl_id = lvl_id; } 
    public String getDimension() { return dimension; } 
    public void setDimension(String dimension) { this.dimension = dimension; } 
    public String getTitle() { return title; } 
    public void setTitle(String title) { this.title = title; } 
    public List<Food> getFoodList() { return foodList; } 
    public void setFoodList(List<Food> foodList) { this.foodList = foodList; } 

} 

食品クラス

@SequenceGenerator(name = "food_seq", sequenceName = "food_seq") 
@Entity 
@Table(name = "Food") 
public class Food { 
    @Id 
    @GeneratedValue(generator = "food_seq") 
    @Column(name = "food_id") 
    private int food_id; 
    @Column(name = "location") 
    private String location; 
    @ManyToOne 
    @JoinColumn(name = "lvl_id") 
    private Lvl lvl_id; 
    //getset 
    public int getFood_id() { return food_id; } 
    public void setFood_id(int food_id) { this.food_id = food_id; } 
    public String getLocation() { return location; } 
    public void setLocation(String location) { this.location = location; } 
    public Lvl getLvl_id() { return lvl_id; } 
    public void setLvl_id(Lvl lvl_id) { this.lvl_id = lvl_id; } 
} 

FoodController

@Controller 
public class FoodController 
{ 
    @Autowired 
    private LvlService lvlService; 
    @Autowired 
    private FoodService foodService; 
    @RequestMapping("/food") 
    public String listFood(Map<String, Object> map) 
    { 
     List<Integer> lvl = new ArrayList<>(); 
     map.put("food", new Food()); 
     map.put("foodList", foodService.getAll()); 
     for(Lvl o : lvlService.getAll()) 
     { 
      lvl.add(o.getLvl_id()); 
     } 
     map.put("lvlList", lvl); 

     return "food"; 
    } 
    @RequestMapping(value = "/addFood", method = RequestMethod.POST) 
    public String addFood(@ModelAttribute("food") Food food, BindingResult result) 
    { 
     foodService.addFood(food); 
     return "redirect:/food"; 
    } 
    @RequestMapping("/deleteFood/{foodId}") 
    public String deleteFood(@PathVariable("foodId") int id) 
    { 
     foodService.removeFood(id); 
     return "redirect:/food"; 
    } 
} 

とJSPビュー:

<%@ page language="java" contentType="text/html; charset=utf8" 
    pageEncoding="utf8"%> 
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf8"> 
    <title><spring:message code="label.bookmark" /></title> 
</head> 
<body> 

<a href="<c:url value="/index" />"> 
    <spring:message code="label.menu" /> 
</a> 

<h3><spring:message code="label.foods" /></h3> 

<form:form method="post" action="addFood" commandName="food"> 
    <table> 
     <tr> 
      <td> 
      <form:label path="location"> 
       <spring:message code="label.location" /> 
      </form:label> 
      </td> 
      <td> 
      <form:input path="location" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
      <form:label path="lvl_id"> 
       <spring:message code="label.lvl_id" /> 
      </form:label> 
      </td> 
      <td> 
      <form:select path="lvl_id" items="${lvlList}"> 
      </form:select> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
      <input type="submit" value="<spring:message code="label.addfood"/>" /> 
      </td> 
     </tr> 
    </table> 
</form:form> 
</body> 
</html> 

問題は、ImがJSPを使用してFoodを追加しようとしたとき - 外部キー(lvl_id)は常にnullです。 JSPで入力タイプを変更しようとしましたが、クラスのカスケード型はmappedbyを@JoinColumnに置き換えました。結果はありません。誰かが私を助けることができますか?おかげさまで

答えて

0
@JoinColumn(name = "lvl_id", nullable = false) 
private Lvl lvl_id; 

であり、オブジェクトFood.lvl_idのexistとnotnullでデバッガをチェックインします。また

@RequestMapping(value = "/addFood", method = RequestMethod.POST) 
public String addFood(@ModelAttribute Food food, Model model) { 
    foodService.addFood(food); 
    return "redirect:/food"; 
} 

Javaで使用すると、変数の命名にラクダのスタイルを使用する必要があります。

は、コントローラ内のこの変形方法を試してみてください。

lvl_id - > lvlId;)

+0

これでエラーが発生します。 要求処理に失敗しました。入れ子にされた例外はorg.springframework.validation.BindExceptionです:org.springframework.validation.BeanPropertyBindingResult:1エラー サーバがこのリクエストを実行できないような内部エラーが発生しました。 –

+0

以上: org.springframework.web.util.NestedServletException:リクエストの処理に失敗しました。入れ子になった例外はorg.springframework.validation.BindExceptionです:org.springframework.validation.BeanPropertyBindingResult:1エラー フィールド 'lvl_id'のオブジェクト 'food'のフィールドエラー:拒否された値[1];コード[typeMismatch.food.lvl_id、typeMismatch.lvl_id、typeMismatch.net.day7.gamebase.domain.Lvl、typeMismatch];引数[org.springframework.context.support.DefaultMessageSourceResolvable:codes [food.lvl_id、lvl_id];引数[];デフォルトメッセージ[lvl_id]];デフォルトメッセージ –

+0

['java.lang.String'タイプのプロパティ値を、 'lvl_id'プロパティの 'net.day7.gamebase.domain.Lvl'の必須タイプに変換できませんでした。ネストされた例外はjava.lang.IllegalStateExceptionです:プロパティ 'lvl_id'の必須タイプ[net.day7.gamebase.domain.Lvl]にタイプ[java.lang.String]の値を変換できません:一致するエディタまたは変換戦略が見つかりません] –

0

LVLクラス:

@Entity 
@Table(name = "Lvl") 
public class Lvl implements Serializable { 

private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator = "lvl_seq", strategy = GenerationType.SEQUENCE) 
    @SequenceGenerator(name = "lvl_seq", sequenceName = "lvl_seq", allocationSize = 1) 
    @Column(name = "lvl_id") 
    private int lvl_id; 

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

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

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumns({ @JoinColumn(name = "lvl_id", referencedColumnName = "lvl_id", nullable = false) }) 
    @org.hibernate.annotations.Cascade({ org.hibernate.annotations.CascadeType.ALL }) 
    private List<Food> foodList; 

    //getters and setters 
} 

フードクラス:

@Entity 
@Table(name = "Food") 
public class Food implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator = "food_seq", strategy = GenerationType.SEQUENCE) 
    @SequenceGenerator(name = "food_seq", sequenceName = "food_seq", allocationSize = 1) 
    @Column(name = "food_id") 
    private int food_id; 

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

    @ManyToOne(optional = false) 
    @JoinColumns({ @JoinColumn(name = "lvl_id", referencedColumnName = "lvl_id", insertable = false, updatable = false) }) 
    private Lvl lvl_id; 

} 

上記のクラスを試してみてください。それは動作するはずです。

+0

完了しましたが、今エラーが発生しました: エラー: org.springframework.web.context.ContextLoader - コンテキストの初期化に失敗しました org.springframework.beans.factory.BeanCreationException:名前 'foodDAOImpl'を持つBeanの作成中にエラーが発生しました:autowired依存関係の注入に失敗しました。ネストされた例外はorg.springframework.beans.factoryです。BeanCreationException:フィールドをautowireできませんでした:private org.hibernate.SessionFactory net.day7.gamebase.dao.FoodDAOImpl.sessionFactory;入れ子にされた例外はorg.springframework.beans.factory.BeanCreationExceptionです: –

+0

ServletContextリソース[/WEB-INF/spring/data.xml]で定義された 'sessionFactory'という名前のBeanを作成中にエラーが発生しました:initメソッドの呼び出しに失敗しました。ネストされた例外はorg.hibernate.MappingExceptionです:org.hibernate.mapping.Table(Lvl)とそれに関連するスーパーテーブルとセカンダリテーブルの論理名:food_idの列を見つけることができません –

+0

And: - autowireフィールドはありません: - エラーの作成ServletContextリソースで定義された 'sessionFactory'という名前のBean - org.hibernate.mapping.Table(Lvl)とそれに関連するスーパーテーブルとセカンダリテーブルの論理名:food_idを持つ列を見つけることができません –

関連する問題