2016-01-15 43 views
0

我有兩個表到數據庫:類別。現在我想讓用戶可以將書籍添加到書籍表中的頁面,但是從類別表中選擇適當的類別。獲取JSF下拉值並保存到數據庫

我可以添加成表,但我不能保存價值表。

Book [Category[2]

你可以從表中看到外鍵CATEGORY_ID類別表。

這裏是模型類:

Book模型

@Entity 
@Table(name = "book") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Book.findAll", query = "SELECT b FROM Book b"), 
@NamedQuery(name = "Book.findByBookId", query = "SELECT b FROM Book b WHERE b.bookId = :bookId")}) 

public class Book implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "book_id") 
private Integer bookId; 
@Basic(optional = false) 
@NotNull 
@Lob 
@Size(min = 1, max = 65535) 
@Column(name = "name") 
private String name; 
@Lob 
@Size(max = 65535) 
@Column(name = "description") 
private String description; 
@JoinColumn(name = "category", referencedColumnName = "category_id") 
@ManyToOne 
private Category category; 

public Book() { 
} 

public Book(Integer bookId) { 
    this.bookId = bookId; 
} 

public Book(Integer bookId, String name) { 
    this.bookId = bookId; 
    this.name = name; 
} 

public Integer getBookId() { 
    return bookId; 
} 

public void setBookId(Integer bookId) { 
    this.bookId = bookId; 
} 

public String getName() { 
    return name; 
} 

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

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public Category getCategory() { 
    return category; 
} 

public void setCategory(Category category) { 
    this.category = category; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (bookId != null ? bookId.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Book)) { 
     return false; 
    } 
    Book other = (Book) object; 
    if ((this.bookId == null && other.bookId != null) || (this.bookId != null && !this.bookId.equals(other.bookId))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "com.biblioteka.app.domen.Book[ bookId=" + bookId + " ]"; 
} 

}

分類模型

@Entity 
@Table(name = "category") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Category.findAll", query = "SELECT c FROM Category c"), 
@NamedQuery(name = "Category.findByCategoryId", query = "SELECT c FROM Category c WHERE c.categoryId = :categoryId")}) 

public class Category implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "category_id") 
private Integer categoryId; 
@Basic(optional = false) 
@NotNull 
@Lob 
@Size(min = 1, max = 65535) 
@Column(name = "name") 
private String name; 
@Lob 
@Size(max = 65535) 
@Column(name = "description") 
private String description; 
@OneToMany(mappedBy = "category") 
private Collection<Book> bookCollection; 

public Category() { 
} 

public Category(Integer categoryId) { 
    this.categoryId = categoryId; 
} 

public Category(Integer categoryId, String name) { 
    this.categoryId = categoryId; 
    this.name = name; 
} 

public Integer getCategoryId() { 
    return categoryId; 
} 

public void setCategoryId(Integer categoryId) { 
    this.categoryId = categoryId; 
} 

public String getName() { 
    return name; 
} 

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

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

@XmlTransient 
public Collection<Book> getBookCollection() { 
    return bookCollection; 
} 

public void setBookCollection(Collection<Book> bookCollection) { 
    this.bookCollection = bookCollection; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (categoryId != null ? categoryId.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Category)) { 
     return false; 
    } 
    Category other = (Category) object; 
    if ((this.categoryId == null && other.categoryId != null) || (this.categoryId != null && !this.categoryId.equals(other.categoryId))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "com.biblioteka.app.domen.Category[ categoryId=" + categoryId + " ]"; 
} 

}

現在我有一個JSF頁面,我在這裏添加了預訂到數據庫。我有下拉列表,它加載類別。用戶應選擇一個類別並將圖書保存到表格中。

這是從的代碼JSF addBook頁面

<p:layoutUnit position="center"> 
      <h:form> 
       <p:inputText value="#{bookBean.name}" a:placeholder="Ime knjige"></p:inputText><br/> 
       <p:inputText value="#{bookBean.description}" a:placeholder="Opis knjige"></p:inputText><br/> 
       <p:selectOneMenu value="#{bookBean.category}"> 
        <f:selectItems value="#{categoryBean.allCategories}" var="c" 
            itemLabel="#{c.name}" itemValue="#{c.categoryId}"/> 

       </p:selectOneMenu> 
       <b/><b/> 
       <p:commandButton value="Dodaj knjigu" action="#{bookBean.addBook()}"/> 
      </h:form> 
     </p:layoutUnit> 

正如你可以看到我使用selectOneMenu用於與價值bookBean.category,然後我不知道我需要在selectItems的將其設置爲值。

BookBean代碼:

@ManagedBean 
@ApplicationScoped 
public class BookBean { 

String name; 
String description; 
int categoryId; 
Category category; 

@Inject 
public BookEJB bookEJB; 

public void addBook(){ 

    Book book = new Book(); 
    book.setName(name); 
    book.setDescription(description); 
    book.setCategory(category); 

    bookEJB.addBook(book); 
} 

public List<Book> getAllBooks(){ 
    return bookEJB.getAll(); 
} 


public String getName() { 
    return name; 
} 

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

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public int getCategoryId() { 
    return categoryId; 
} 

public void setCategoryId(int categoryId) { 
    this.categoryId = categoryId; 
} 

public Category getCategory() { 
    return category; 
} 

public void setCategory(Category category) { 
    this.category = category; 
} 

public BookEJB getBookEJB() { 
    return bookEJB; 
} 

public void setBookEJB(BookEJB bookEJB) { 
    this.bookEJB = bookEJB; 
} 

}

回答

0

試試這個:

<f:selectItems value="#{categoryBean.allCategories}" var="c" 
           itemLabel="#{c.name}" itemValue="#{c}"/> 

所列項目的名稱將是類別名稱和類別將被分配到bookBean.category,這可以設置爲書籍類別並保持。

希望這會有所幫助。

+0

我試過這個,不知何故它不起作用。你有其他想法嗎? – Zookey

+0

下一次,而不是說「它不工作」,谷歌錯誤消息。錯誤消息是答案。這只是找到解釋的問題。你可以找到http://stackoverflow.com/q/4734580 – BalusC

+0

@BalusC謝謝,這有幫助。現在我得到NPE,因爲看起來Converter中的ManagedBean是全空的。我如何解決這個問題? – Zookey

相關問題