2016-07-19 71 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

這可能是目前唯一的解決方法。非常感謝! –