Spring + Hibernate DAO:获取多对多的方法

时间:2014-07-04 08:30:43

标签: java hibernate many-to-many dao

根据本教程:

hibernate-many-to-many-example-join-table-extra-column-annotation

我不能像这样使用@id:

@Id
@GeneratedValue
@Column(name = "id")
private int id;

public int getId() {
    return id;
}

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

但我必须实施StockCategoryId.javaStockCategory.java

现在我正在为StockCategory实现DAO类。

我如何编写getStockCategory方法?

对于其他实体,我总是使用这样的东西:

public StockCategory getStockCategory(int id)  throws RecordNotFoundException
{   
    StockCategory stock_category= (StockCategory) getCurrentSession().get(StockCategory.class, id);

    return stock_category;
}

但是在这些实现我的多对多关系的类中,我应该实现相同的方法,但是传递2个ID:

public StockCategory getStockCategory(int stock_id, int category)  throws RecordNotFoundException;

问题1:如何实施此方法?

例如,我向您展示了如何实现删除方法:

public void deleteStockCategory(int stock_id, int category_id)  throws RecordNotFoundException
{       
    /*
    * get the record
    */
    StockCategory stock_category = getStockCategory(stock_id, category_id);


    /*
    * if exists, delete the record
    */
    if (stock_category != null)
    {       
        getCurrentSession().delete(stock_category );
    }
}

问题2:我是否应该为StockCategoryId实现DAO类?如果是,我必须投入哪些方法?

非常感谢!

2 个答案:

答案 0 :(得分:2)

问题1:
您在这里使用了hibernate的JPA注释。如果您想通过Id获取,JPA要求将主键包装在一个类型中。对于大多数实体,您使用的是标准Java类型,例如long。在这种情况下,虽然您有一个复合主键(它由多个字段组成)。这意味着您必须创建一个自定义类型(类)来包装主键。

在示例中,您已经使用类StockCategoryId完成了此操作。请注意,此类注释为可嵌入。它不是一个独特的实体,拥有它自己的桌子。它是一组可以嵌入任意数量的不同实体的列。在这种情况下,它用于收集形成主键的两列(使用embeddedId注释)。因此,当您想获得特定记录时,这就是您的DAO应该期待的。

public StockCategory getStockCategory(StockCategoryId id) throws RecordNotFoundException
{   
    StockCategory stock_category = 
      (StockCategory)getCurrentSession().get(StockCategory.class, id);

    return stock_category;
}

问题2:
没有必要为StockCategoryId创建一个DAO,因为它不是一个实体本身。它只是一个实体的片段。如果你问你的DAO得到一个StockCategoryId什么表会休眠查询?

注意:
您可能实际上不需要DAO来获取单个库存类别。检索单个股票或类别的股票类别可能更有意义。为此,您可以使用相关的DAO获取您的Stock或Category,然后调用该方法获取该对象的StockCategory集合。

E.G。

StockDAO dao = new StockDAO();
Stock stock = dao.findByPrimaryKey(1);
Set<StockCategory> stockCategories = stock.getStockCategories();

或类似的东西......希望它有所帮助。

答案 1 :(得分:0)

如果您需要将复合键映射为主键,那么您确实需要创建StockCategoryId类,因为这两个整数是您的主键。

id类需要使用@Embeddable:

进行注释
@Embeddable
class StockCategoryId implements Serializable {
  Integer stockId;
  Integer categoryId;
}

而您的实体现在将拥有一个使用@EmbeddedId而不是@Id注释的StockCategory类型的字段;

@Entity
class StockCategory implements Serializable {
  @EmbeddedId StockCategoryId stockCategoryId;
}

然后,当您在持久化上下文中搜索实体而不是您习惯使用的int时,您将始终使用StockCategoryId类。

请查看hibernate文档以获得进一步说明: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-hibspec-entity

但是,我不确定您的数据模型示例中您的多对多关系在哪里,因为这些是一个实体中的复合键,并且该实体没有链接到任何其他实体。