根据本教程:
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.java
和StockCategory.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类?如果是,我必须投入哪些方法?
非常感谢!答案 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
但是,我不确定您的数据模型示例中您的多对多关系在哪里,因为这些是一个实体中的复合键,并且该实体没有链接到任何其他实体。