在Hibernate中分组/分割多对多关系?

时间:2014-03-19 02:14:20

标签: hibernate join

有没有办法在Hibernate中使用连接表建立多对多关系,该连接表使用连接表中的列来确定项目是否属于关系?

此外,是否可以通过连接表中的键(而不是目标表中的键)指定相关项的顺序?

我们说我有User和TVShow表,以及UserShow连接表。我希望我的用户有多种类别的节目(比如说,"有线""广播和#34;)。定义这个的一种方法是添加一个"类别int"列到UserShow连接表,然后连接查询可以有一个WHERE子句,指定哪个类别。我没有在@JoinTable或@JoinColumn注释中看到任何可以让我对加入进行限定的内容。

同样对于排序,UserShow连接表有一个"序列int"列,指定用户显示的顺序。 @OrderBy的所有示例都建议使用目标表列。

编辑:

以下是我建议的表格:

create table User
(
    mId         integer         auto_increment primary key not null,
);

create table TVShow
(
    mId         integer         auto_increment primary key not null,
    mName       varchar(128)    not null,
);

create table UserShow
(
    mId         integer         auto_increment  primary key not null,
    mUserId     integer         not null,
    mShowId     integer         not null,
    mCategory   integer         default 0,
    mSequence   integer         default 0,

    constraint cUserShowUser  foreign key (mUserId) references User(mId),
    constraint cUserShowShow  foreign key (mShowId) references TVShow(mId)
);

我希望能够以mSequence顺序为mCategory = 1获取用户的所有TVShows,并以mSequence顺序单独获取mCategory = 2的用户的所有TVShows。

User.java:

@Entity
@Table
@Proxy(lazy = true)
public
class
User implements java.io.Serializable
{
    public  Long                getId()                                     { return mId; }
    public  void                setId(Long inVal)                           { mId = inVal; }

    public  List<TVShow>        getShows()                                  { return mShows; }
    public  void                setShows(List<TVShow> inVal)                { mShows = inVal; }

    public  void                addShow(TVShow inShow)                      { getShows().add(inShow); }

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

    @OneToMany(cascade = {})
    @JoinTable(name = "UserShow",
                joinColumns = @JoinColumn(name = "mUserId"),
                inverseJoinColumns = @JoinColumn(name = "mShowId"))
    @OrderBy("mName asc")
    private List<TVShow>        mShows;

    private static  Logger  sLogger                         =   Logger.getLogger(User.class);
}

TVShow.java:

@Entity
@Table
@Proxy(lazy = true)
public
class
TVShow implements java.io.Serializable
{
    public  Long                getId()                                     { return mId; }
    public  void                setId(Long inVal)                           { mId = inVal; }

    public  String              getName()                                   { return mName; }
    public  void                setName(String inVal)                       { mName = inVal; }

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

    private static  Logger      sLogger                         =   Logger.getLogger(TVShow.class);
}

0 个答案:

没有答案