当前位置: 首页 > 知识库问答 >
问题:

使用@ManyToMany JPA注释时不需要的唯一约束

危钱明
2023-03-14

我在我的项目中使用spring boot/spring data jpa。spring发布后,下面的实体将在oracle中创建表。jpa。冬眠ddl auto设置为更新。

@Entity
@Table(name = "SCENARIO")
public class Scenario {

    private Integer worksetId;
    private Integer ruleSetId;
    private Set<Rule> rules;

    @Id
    public Integer getWorksetId() {
        return worksetId;
    }

    public void setWorksetId(Integer worksetId) {
        this.worksetId = worksetId;
    }

    @Column(name = "RULE_SET_ID")
    public Integer getRuleSetId() {
        return ruleSetId;
    }

    public void setRuleSetId(Integer ruleSetId) {
        this.ruleSetId = ruleSetId;
    }

    @ManyToMany
    @JoinTable(name = "RULE_SET", joinColumns = @JoinColumn(name = "WORKSET_ID", referencedColumnName = "RULE_SET_ID"), inverseJoinColumns = @JoinColumn(name = "RULE_ID", referencedColumnName = "ID"))
    public Set<Rule> getRules() {
        return rules;
    }

    public void setRules(Set<Rule> rules) {
        this.rules = rules;
    }

}

@Entity
@Table(name = "RULE")
public class Rule {
    private Integer id;
    private String description;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getId() {
        return id;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

我期待的是非常简单的场景/规则表将被创建,以及一个名为RULE_SET的映射表。一切都很顺利,只是在表场景中创建了一个不需要的对RULE_SET_ID的唯一约束,但显然相同的RULE_SET_ID应该能够被多个场景共享。谁能帮忙吗?非常感谢!!

顺便说一句,我正在使用带有Hibernate5.0.9的Spring-boot 1.4.0

共有1个答案

哈襦宗
2023-03-14

显然,如果您使用了referencedColumnName=“RULE_SET_ID”RULE_SET_ID,则应该是唯一的。

您可以为Scenario使用代理键

@Entity
@Table(name = "SCENARIO")
public class Scenario {

    @Id
    @GeneratedValue
    private Integer id;

}

并使用@manytomy映射

@ManyToMany
@JoinTable(name = "RULE_SET", joinColumns = @JoinColumn(name = "WORKSET_ID"), 
    inverseJoinColumns = @JoinColumn(name = "RULE_ID"))
public Set<Rule> getRules() {
    return rules;
}

使现代化

我想使用规则集实体来表示一组规则(使用联接表进行映射):

@Entity
class RuleSet {

  @OneToMany
  private List<Rule> rules = new ArrayList<Rule>();

}
 类似资料:
  • 问题内容: 我正在使用这些注释将数据输入数据库表。我想使userId字段唯一。但是当我这样做时,它向我显示错误 问题答案: 或者,如果它是数据库生成的ID,您也可以执行此操作

  • 我试图创建自定义注释来检查唯一的字段值。例如,检查唯一的电子邮件地址等。 但无法自动关联“customerDAO”对象。它抛出异常组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套的异常是javax。验证。ValidationException:isValid调用期间发生意外异常。 我在哪里犯错?请建议。 顾客JAVA 唯一的JA

  • 我试图弄清楚使用运行时级别保留注释(例如:@javax.inject.named)注释的类在编译时和运行时类路径方面的确切影响。这是我到目前为止的理解: null 如果是这种情况,我是否需要创建一个包装对象(用@javax.inject.named注释)来委托内部的、未注释的对象?是否还有一个在编译时禁用注释处理的选项?参见http://docs.oracle.com/javase/7/docs/

  • 我有以下代码,这是我的API的艺术 如果我有@ApiParam注释,@PathVariable就变成非必需的,所以如果我没有输入userId并通过Swagger UI发出请求,请求仍然会转到服务器,这会导致不必要的服务器错误。默认情况下,@Path变量的参数“必需”为true(因此,默认值为@PathVariable(name=“userId”,必需=true)),并且在该参数上没有@ApiPar

  • 这是我的限制: 该查询证明约束实际上不起作用: 下面是输出: 为什么唯一性没有被强制执行?

  • 它的方法是应用唯一的两列约束模型使用peewee。有原始的方法(使用),但我正在寻找另一种方法。 我使用postgres,所以我试图像@booshong下面说的那样做,然后在原始SQL我给出了以下内容(为了简单起见,与事务相关的和省略并输出): 正如我们所看到的,正如我前面所说,这是不同的事情。