0

我正在使用 Spring 3.1 / Hibernate / Jackson 创建一个 Restfull API 服务器。

我有一个“购买”控制器/模型/道。

我现在需要添加“标记”购买的功能。

因此,一个带有“tagId”和“tagName”的简单类链接回“Purchase”。
一个“Purchase”可以有多个“Tags”,一个“Tag”只能属于一个“Purchase”。

代表我必须添加的这个新的“标签”类的最佳方式是什么?IE

  • 我应该将 purchaseId 属性添加到“标签”模型并以某种方式对其进行注释吗?
  • 我应该添加一个“标签列表”归因于购买”模型吗?
  • 我会创建一个作为“PurchaseController”子类的“Tag”控制器吗?
  • ETC...

本质上,我正在寻找使用 Spring 进行设计的最佳实践方法。

此外,任何关于我可以采用的设计模式的建议都将受到欢迎。
也许装饰者模式在这里适用?

当然,所有购买和标签都必须保存到数据库中。

谢谢

采购控制人:

@Controller
public class PurchaseController
{

    @Autowired
    private IPurchaseService purchaseService;

    @RequestMapping(value = "purchase", method = RequestMethod.GET)
    @ResponseBody
    public final List<Purchase> getAll()
    {
        return purchaseService.getAll();
    }

    @RequestMapping(value = "purchase/{id}", method = RequestMethod.GET)
    @ResponseBody
    public final Purchase get(@PathVariable("id") final Long id)
    {
        return RestPreconditions.checkNotNull(purchaseService.getById(id));
    }

    @RequestMapping(value = "purchase/tagged", method = RequestMethod.GET)
    @ResponseBody
    public final List<Purchase> getTagged()
    {
        return RestPreconditions.checkNotNull(purchaseService.getTagged());
    }

    @RequestMapping(value = "purchase/pending", method = RequestMethod.GET)
    @ResponseBody
    public final List<Purchase> getPending()
    {
        return RestPreconditions.checkNotNull(purchaseService.getPending());
    }

    @RequestMapping(value = "purchase", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public void create(@RequestBody final Purchase entity)
    {
        RestPreconditions.checkRequestElementNotNull(entity);
        purchaseService.addPurchase(entity);
    }
}

购买型号:

@Entity
@XmlRootElement
public class Purchase implements Serializable
{
    /**
     * 
     */
    private static final long serialVersionUID = 6603477834338392140L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long pan;

    public Long getId()
    {
        return id;
    }

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

    public Long getPan()
    {
        return pan;
    }

    public void setPan(Long pan)
    {
        this.pan = pan;
    }
}
4

2 回答 2

1

购买模式需要修改如下。

@Entity
public class Purchase implements Serializable
{
/**
 * 
 */
    private static final long serialVersionUID = 6603477834338392140L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long pan;

    @OneToMany(mappedBy = "instance", fetch = FetchType.LAZY)
    private Set<Tag> tags;

    public Long getId()
    {
      return id;
    }

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

    public Long getPan()
    {
        return pan;
    }

    public void setPan(Long pan)
    {
        this.pan = pan;
    }

    public void setTags(Set<Tag> tags){
        this.tags = tags;
    }

    @JsonIgnore
    public Set<Tag> getTags(){
        if(tags == null){
           tags = new LinkedHashSet<Tag>();
        }
        return tags;
    }
}

和标签模型将如下所示。

@Entity
public class Tag implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({ @JoinColumn(name = "PURCHASE__ID", referencedColumnName = "ID") })
    private Purchase purchase;

    //Other attributes, getters and setters

   @JsonIgnore
   public Purchase getPurchase(){
       return this.purchase;
   }


}

如果 Purchase 拥有关系(父),您可以在 PurchaseService 和 PurchaseController 中实现标签特定的方法,或者为标签实现单独的服务和控制器类。

于 2012-05-30T14:23:04.190 回答
0

您已经在购买控制器中包含了“标记”概念:getTagged

我将构建一个包含List<ITag> Tags购买模型中的属性的设计,因为这可能是在您当前的设计中实现它的最简单和最直接的方式。

于 2012-05-29T21:53:55.520 回答