2015-02-09 103 views
0

我想为简单的产品页面做一个CRUD表单。我有一个奇怪的问题,每当我尝试插入新产品时,我总是会更新旧产品,因此总会有一种产品在每次保存时都会更新。Play2 MongoDb新插入更新记录

index.scala.html如下

@main("Product List"){ 

@inputText(productForm("search"),'_label -> "Search",'id -> "search") 

<h3>@products.size() product(s)</h3> 

<table class="table table-condensed"> 
    <thead> 
     <tr> 
     <th>Title</th> 
     <th>Cost</th> 
     <th>Price</th> 
     <th>Promo Price</th> 
     <th>Savings</th> 
     <th>On Sale</th> 
     </tr> 
    </thead> 
    <tbody> 
    @for(product <- products){ 
     <tr> 
     <td> 
      @product.title 
     </td> 
     <td> 
      @product.pricing.cost 
     </td> 
     <td> 
      @product.pricing.price 
     </td> 
     <td> 
      @product.pricing.promoPrice 
     </td> 
     <td> 
      @product.pricing.savings 
     </td> 
     <td> 
      @product.pricing.onSale 
     </td> 
     <td>  
      @helper.form(action = routes.Application.deleteProduct(product.id)){ 
       <input type="submit" value="Delete"/> 
      } 
     </td> 
     </tr> 
    } 
    </tbody> 
</table> 

<h2>Add new product</h2> 
@form(action = routes.Application.newProduct()){ 
    @inputText(productForm("title"),'_label -> "Title") 
    @inputText(productForm("pricing.cost"),'_label -> "Cost") 
    @inputText(productForm("pricing.price"),'_label -> "Price") 
    @inputText(productForm("pricing.promoPrice"),'_label -> "Promo Price") 
    @inputText(productForm("pricing.savings"),'_label -> "Savings") 
    @checkbox(productForm("pricing.onSale"),'_label -> "On Sale") 
    <input type="submit" class="btn btn-default" value="Add"/> 
} 
} 

Application.java如下,

public class Application extends Controller { 
.... 
static Form<Product> productForm = new Form<Product>(Product.class); 

public static Result products() { 
     return ok(views.html.index.render(Product.all(), productForm)); 
    } 

public static Result newProduct() { 
     Form<Product> filledForm = productForm.bindFromRequest(); 
     if (productForm.hasErrors()) { 
      return badRequest(views.html.index 
        .render(Product.all(), filledForm)); 
     } else { 
      Product.create(filledForm.get()); 
      return redirect(routes.Application.products()); 
     } 
    } 
} 

而且我的模型Product.java如下,

public class Product { 


    private static final long serialVersionUID = 94587092799205246L; 

    @Id 
    public long id; 

    @Required 
    public String title; 

    @Required 
    public Pricing pricing; 

    public Product(){ 
    } 

    public Product(String title){ 
     this.title = title; 
    } 

    private static JacksonDBCollection<Product, Long> products = MongoDB 
      .getCollection("product", Product.class, Long.class); 

    public static List<Product> all() { 
     return Product.products.find().toArray(); 
    } 

    public static void create(Product product) { 
     Product.products.save(product); 
    } 

    public static void delete(Long id) { 
     Product p = Product.products.findOneById(id); 
     if(p != null){ 
      Product.products.remove(p); 
     } 
    } 

} 

我不知道这是否是因为表单声明为静态或表单doe不会在某个地方被清除。一双额外的眼睛在这里会有很大的帮助。感谢您的时间

+0

什么是你的数据库中更新此对象的ID? – marcinn 2015-02-09 14:42:20

+0

> db.product.find() {“_id”:NumberLong(0),“title”:“Potato”,“pricing”:{“cost”:10,“price”:20,“promoPrice”:10 ,“储蓄”:10,“onSale”:true}} – 2015-02-09 15:11:09

+0

@marcinn它不断地更新这个对象,而不是做一个新的插入 – 2015-02-09 15:11:38

回答

0

尝试

@Id 
    @ObjectId 
    public String id; 

加入@ObjectId,并键入String .Seems为指向的@marcinn

docs

如果该ID是不能产生服务器首先收到一个没有_id字段 的文档,然后服务器将该字段移到开头。

+0

谢谢,但来自一个关系数据库学派的思想,我是在'_id'应该总是长而不是字符串的假设下......?http://docs.mongodb.org/manual/tutorial/create-一个自动递增字段/也表明相同? – 2015-02-09 23:54:21

+0

@ g0c00l.g33k我的解决方案也可以解决您的问题 – silentprogrammer 2015-02-10 04:50:18

+0

@singakash nope这似乎也没有帮助 – 2015-02-10 09:34:09