Spring 使用@ManyToMany JPA注释时不需要的唯一约束
我正在为我的项目使用SpringBoot/SpringDataJPA。当spring.jpa.hibernate.ddl-auto设置为update时,下面的实体将在oracle中创建表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;
@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>();
}