Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用@ManyToMany JPA注释时不需要的唯一约束_Spring_Hibernate_Jpa - Fatal编程技术网

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

Spring 使用@ManyToMany JPA注释时不需要的唯一约束,spring,hibernate,jpa,Spring,Hibernate,Jpa,我正在为我的项目使用SpringBoot/SpringDataJPA。当spring.jpa.hibernate.ddl-auto设置为update时,下面的实体将在oracle中创建表 @Entity @Table(name = "SCENARIO") public class Scenario { private Integer worksetId; private Integer ruleSetId; private Set<Rule> rules;

我正在为我的项目使用SpringBoot/SpringDataJPA。当spring.jpa.hibernate.ddl-auto设置为update时,下面的实体将在oracle中创建表

@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;
    }

}
@实体
@表(name=“场景”)
公共类场景{
私有整数工作台;
私有整数规则集ID;
私人制定的规则;
@身份证
公共整数getWorksetId(){
返回工作台;
}
公共void setWorksetId(整数worksetId){
this.worksetId=worksetId;
}
@列(name=“RULE\u SET\u ID”)
公共整数getRuleSetId(){
返回规则集ID;
}
public void setRuleSetId(整数ruleSetId){
this.ruleSetId=ruleSetId;
}
@许多
@JoinTable(name=“RULE\u SET”,joinColumns=@JoinColumn(name=“WORKSET\u ID”,referencedColumnName=“RULE\u SET\u ID”),inverseJoinColumns=@JoinColumn(name=“RULE\u ID”,referencedColumnName=“ID”))
公共集getRules(){
退货规则;
}
公共无效设置规则(设置规则){
这个。规则=规则;
}
}
@实体
@表(name=“RULE”)
公共阶级规则{
私有整数id;
私有字符串描述;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
公共整数getId(){
返回id;
}
公共无效集合id(整数id){
this.id=id;
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
}
我所期望的是非常简单的,将创建场景/规则表,以及名为RULE_SET的映射表。一切都进行得很顺利,只是在表场景中创建了一个对RULE_SET_ID的不需要的唯一约束,但显然相同的RULE_SET_ID应该能够被多个场景共享。有人能帮忙吗?非常感谢


顺便说一句,我使用的是spring boot 1.4.0和hibernate 5.0.9。显然,如果您使用了
referencedColumnName=“RULE\u SET\u ID”
RULE\u SET\u ID应该是唯一的

您可以为
场景使用代理键

@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;
}

谢谢你的及时回复!然而,逻辑是,我有几个使用rule\u set\u id分组的规则,相同的rule\u set\u id可以在不同的场景中使用。话虽如此,场景中的规则设置id在场景表中不应该是唯一的。或者我不正确地使用了@ManyToMany?这可能是目前唯一的解决办法。非常感谢@罗杰中:不客气。我不能正确理解您的任务,但我认为这不是一个临时的解决方法——它是数据库模式的有效方法。
@Entity
class RuleSet {

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

}