4

外部キーがデータベースに入力されていないため、Hibernate ManyToOne に問題があります。

だから私は準備クラスと食材クラスを持っています. componentsId は私の準備クラスの外部キーであるはずです。

私の準備クラスには、ManyToOne アノテーションがあります。nullable=false を設定しないと、データベースの準備テーブルを埋めることができますが、外部キーは「NULL」のままです。nullable=false を設定すると、もちろん、「非 null プロパティが null または一時的な値を参照しています...」というエラー メッセージが表示されます。

私のPreparationDaoにも何か問題があるのか​​もしれません...

私は自分が間違っていることを本当に知りません。あなたが私を助けてくれることを願っています。

これが私の最初の質問であるため、事前に感謝し、事前に申し訳ありません(質問方法に関するガイドラインを読んだ後、私はほとんど質問することを恐れていました:D)、私の問題も非常に愚かかもしれませんが、私は絶対的な初心者です!

私の材料クラス:

@Entity
@Table(name="tbl_ingredients")

public class Ingredients {
    @Id
    @GeneratedValue
    @Column(name="ingredients_id")
    private Integer id;
    private String name;
    private float percent;

//  @OneToMany(mappedBy="ingredients", cascade=CascadeType.ALL)
//  private Set<Preparation> preparation = new HashSet<Preparation>();
//
//
//  public Set<Preparation> getPreparation() {
//      return preparation;
//  }
//
//  public void setPreparation(Set<Preparation> preparation) {
//      this.preparation = preparation;
//  }

    //Konstrukturmethode der Klasse


    public Ingredients(){

    }

    public Ingredients(Integer id, String name, float percent){
        this(name,percent);
        setId(id);
    }

    public Ingredients(String name, float percent){
        setName(name);
        setPercent(percent);
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPercent() {
        return percent;
    }

    public void setPercent(float percent) {
        this.percent = percent;
    }
}

私の準備クラス:

@Entity
@Table(name="tbl_preparation")

public class Preparation {
    @Id
    @GeneratedValue
    @Column(name="preparation_id")
    private Integer id;
    private int amount;
    private String bevvalue;

    @ManyToOne (optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name="ingredients_id", nullable=false)
    private Ingredients ingredients;

    @OneToMany(mappedBy="preparation")
    private Set<Cocktail> cocktail = new HashSet<Cocktail>();

    // Getter und Setter Methoden


    public Preparation(){

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    public Ingredients getIngredients() {
        return ingredients;
    }

    public void setIngredients(Ingredients ingredients) {
        this.ingredients = ingredients;
    }

    public String getBevvalue() {
        return bevvalue;
    }

    public void setBevvalue(String bevvalue) {
        this.bevvalue = bevvalue;
    }

    public Set<Cocktail> getCocktail() {
        return cocktail;
    }

    public void setCocktail(Set<Cocktail> cocktail) {
        this.cocktail = cocktail;
    }
}

準備ダオ:

public class PreparationDao extends HibernateDaoSupport {

    // Methode zum Anlegen der Zubereitung in der Datenbank



            // Methode zum Speichern der Zubereitung
            public Preparation save(Preparation preparation) {
                HibernateTemplate template = getHibernateTemplate();
                template.saveOrUpdate(preparation);
                return preparation;
            }
            // ing cocktailid muss wieder eingetragen werden        
            public void create(Integer [] ingredientsid, int amount, String bevvalue){ 
//              Set<Cocktail> cocktail = new HashSet<Cocktail>();
                HibernateTemplate template = getHibernateTemplate();
                Ingredients ingredients = (Ingredients) template.get(Ingredients.class, ingredientsid);
                Preparation p = new Preparation();
//              p.setCocktail(cocktail);
                p.setIngredients(ingredients);
                p.setAmount(amount);
                p.setBevvalue(bevvalue);
                template.saveOrUpdate(p);
            }
4

2 に答える 2

0

@rhinds は、エラーの場所についておそらく正しいでしょう。

hibernate テンプレートのドキュメント(これは非常に古い春のバージョンのものであり、制御できない何かによって必要とされない場合は imho を使用しないでください) は、HibernateTemplate#get()のみが識別子の配列を受け入れず、単一のテンプレートで動作するように設計されていることを示しています識別子/戻りオブジェクト。

したがって、成分のリストを取得するには、リストを反復処理して成分を 1 つずつ取得する必要があります。

HibernateTemplate template = getHibernateTemplate();
Ingredients[] ingredients;
int i = 0;
for (int currentid: ingredientsid){
    ingredients[i] = (Ingredients) template.get(Ingredients.class, currentid);
    i++
}
Preparation p = new Preparation();
//              p.setCocktail(cocktail);
p.setIngredients(ingredients);
于 2013-06-11T09:38:26.753 に答える