在JPA中定义关联属性

3

我有一个定义如下的OneToMany关系:

class ActionSet {
    @OneToMany
    List<Action> action;
}
class Action {
    ActionSet actionSet;
    Boolean isShared;
}

动作可以在许多操作集之间共享,也可以与单个操作集相关联。

当一个动作被共享时,它对于一些操作集可能很重要,对于其他操作集可能不重要。这里的isImportant 是一个关系属性。我如何在JPA中定义这个关系?

1个回答

3
基本上,你需要三个实体类如下:
ActionSet(动作集):
@Entity
public class ActionSet {

    @OneToMany(mappedBy = "actionSet")
    List<ActionSetAction> action;
}

操作:

@Entity
public class Action {

    @OneToMany(mappedBy = "action")
    List<ActionSetAction> action;
}

ActionSetAction(代表Join表):


@Entity
public class ActionSetAction {

    @ManyToOne
    @JoinColumn(name = "action_set_id")
    private ActionSet actionSet;

    @ManyToOne
    @JoinColumn(name = "action_id"
    private Action action;

    @Column(name ="is_important"
    private boolean important;
}

如果您想在数据库层面上区分重要和不重要的操作,而不是在内存中进行区分,则可以考虑使用非JPA Hibernate特定的@Where注释。
@Entity
public class ActionSet {

    @OneToMany(mappedBy = "action")
    @Where(clause="is_important = true")
    List<ActionSetAction> importantActions;

    @OneToMany(mappedBy = "action")
    @Where("is_important = false")
    List<ActionSetAction> unimportantActions;
}

请注意,最近我回答了一个问题,建议使用纯JPA解决非常相似的问题。但是,虽然在EclipseLink中可以工作,但是在Hibernate中存在问题。
JPA ManyToMany where annotation: https://stackoverflow.com/questions/27411156/jpa-manytomany-where-annotation/27412351#27412351

感谢您详细的答案。我的搜索结果和您的一样。我的唯一担心是它会产生4个以上的数据库表,而不是当前的3个。 - kranthi117
我不明白为什么你需要4张表而不是3张。无论如何,你应该将这个答案标记为正确的答案。 - Alan Hay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接