2010-07-06 53 views
2

我做过类似这样与HBM文件,但到目前为止,我还没有找到一个等效使用注释的东西。我希望能够做的是在连接表中创建一个关联表,其中连接表包含关联的订单列(对于此处的任何不正确的术语感到抱歉)。在非常简单的,该表可能是这样的:使用Hibernate注释操作连接表行排序

Table: Menus 
----- 
menu_id 

Table: Items 
----- 
item_id 

Table: Menus_Items 
---- 
menu_id 
item_id 
order_by 

如果我没有要求的菜单项进行排序(这个ORDER_BY列),我可以没有问题做到这一点;不过,我希望能够以编程方式在单元测试或管理工具中的Menus_Items表中订购商品。为此,我想,我还需要一个MenuItems类,对吗?是,需要

我的问题是什么注解相应的类来实现这一目标? 的类可能是这个样子(这是据我已经有了):

public class Menu { 
    private List<MenuItem> items; 

    // ... 

    @OneToMany 
    @JoinTable(name = "Menus_Items", 
     joinColumns = @JoinColumn(name = "menu_id"), 
     inverseJoinColumns = @JoinColumn(name = "item_id")) 
    @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN }) 
    @IndexColumn(name = "order_by") 
    public List<MenuItem> getItems() { // ... 
    } 

} // end class Menu 

是@IndexColumn正确吗?以编程方式,我如何指定MenuItems集合的顺序?我可能会做错什么?我有一种唠叨的感觉,我失去了一些明显的东西。

任何帮助非常感谢。

回答

1

但是,我希望能够以编程方式在单元测试或管理工具中的Menus_Items表中订购项目。为此,我想,我还需要一个MenuItems类,对吗?

如果这是一个真正的多对多,那么你有什么是正确的。但是你不需要连接表的实体(稍后会有更多介绍)。

我的问题是,什么样的注释需要在相应的类,使这种情况发生?这些类可能是这个样子(这是据我已经有了)

正如我说的,你不需要这个MenuItem实体的连接表,我希望看到之间的ManyToManyMenuItem代替(在参考文档中部分2.2.5.3.4. Indexed collections (List, Map))。

是@IndexColumn是否正确?以编程方式,我如何指定MenuItems集合的顺序?

休眠特定@IndexColumn是正确的。但是,如果您使用的是JPA 2.0实现,则应该更喜欢标准@OrderColumn注释(示例here)。

关于订单,你正在使用的有序集合(List)和顺序是从元素的List(更准确地说,他们的索引将被存储在数据库中)顺序而获得。所以只需按照List<Item>的顺序订购Item即可。

+0

这做到了。谢谢。但是,我坚持使用J2EE 5,而@OrderColumn仅在J2EE 6中可用。我在Mac上,我认为我需要升级到Snow Tiger。 – richever 2010-07-08 13:52:13