2016-07-19 15 views
0

我为我的项目使用了spring-boot/spring-data-jpa。当spring.jpa.hibernate.ddl-auto设置为更新时,下面的实体将在oracle中创建表。使用@ManyToMany JPA注释时产生不必要的唯一约束

@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映射表。除了在表SCENARIO中创建RULE_SET_ID上的不需要的唯一约束之外,一切都会顺利进行,但显然相同的RULE_SET_ID应该能够被多个场景共享。任何人都可以提供帮助吗?非常感激!!

顺便说一句,我使用的是弹簧启动1.4.0与5.0.9休眠

回答

1

很显然,如果你这样做referencedColumnName = "RULE_SET_ID"RULE_SET_ID - 应该是唯一的。

您可以使用Scenario

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

    @Id 
    @GeneratedValue 
    private Integer id; 

} 

代理键,并使用@ManyToMany映射

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

更新

我想用RuleSet实体为一组规则(使用连接表进行映射):

@Entity 
class RuleSet { 

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

} 
+0

感谢您的及时答复!但是,逻辑是,我有几个规则与rule_set_id分组,并且可以在不同情况下使用相同的rule_set_id。据说这样,场景中的rule_set_id在场景表中不应该是唯一的。或者我正在使用@ManyToMany不正确? –

+0

@RogerZhong我更新。 –

+0

这可能是目前唯一的解决方法。非常感谢! –