2017-05-03 29 views
0

好,我使用的是JPA春天引导和我有一个包含下面如何nextCondition从类型RuleCondition描述相同的实体作为孩子的实体:外键约束孩子在一,在JPA的一个关系冬眠

@Entity @Table(name = "EDITOR_REGRA_CONDICAO") 
public class RuleCondition implements Serializable { 

@GenericGenerator(
     name = "ruleConditionSequenceGenerator", 
     strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
     parameters = { 
       @Parameter(name = "sequence_name", value = "SEQ_RULE_CONDITION"), 
       @Parameter(name = "initial_value", value = "1"), 
       @Parameter(name = "increment_size", value = "1") 
     }) 
@GeneratedValue(generator = "ruleConditionSequenceGenerator") 
@Id 
private Long id; 

@OneToOne(fetch = FetchType.LAZY, optional = false) 
@JoinColumn(name = "field", nullable = false) 
private Field field; 

@Column 
private String value; 

@OneToOne(fetch = FetchType.EAGER, optional = false) 
@JoinColumn(name = "operator", nullable = false) 
private RuleOperator ruleOperator; 

@OneToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "connector") 
private RuleConnector ruleConnector; 

@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) 
@JoinColumn(name = "next_condition") 
private RuleCondition nextCondition; 

这是规则条件控制器

@RequestMapping(value = "/rule", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) 
public Rule newRule(@RequestParam("layout") Long layoutId, @RequestBody Rule rule) { 
    return ruleManager.newRule(rule,layoutId); 
} 

和完成,这是该类负责管理规则的条件下操作:

public Rule newRule(@Nonnull final Rule rule, @Nonnull final Long layoutId) { 

    RuleType ruleType = ruleService.getRuleType(rule.getRuleType().getIdentifier()); 

    saveConditions(rule.getCondition()); 

    rule.setRuleType(ruleType); 

    Rule savedRule = ruleService.saveRule(rule); 

    layoutManager.addRule(savedRule, layoutId); 

    return savedRule; 
} 

@Transactional(propagation = Propagation.REQUIRES_NEW) 
private void saveConditions(RuleCondition ruleCondition) { 

    RuleConnector ruleConnector; 
    RuleOperator ruleOperator; 

    if (ruleCondition == null) { 
     return; 
    } 

    if (ruleCondition.getNextCondition() != null) { 
     saveConditions(ruleCondition.getNextCondition()); 
    } 

    if (ruleCondition.getRuleConnector() != null) { 
     ruleConnector = ruleService.getRuleConnector(ruleCondition.getRuleConnector().getIdentifier()); 
     ruleCondition.setRuleConnector(ruleConnector); 
    } 

    if (ruleCondition.getRuleOperator() != null) { 
     ruleOperator = ruleService.getRuleOperator(ruleCondition.getRuleOperator().getIdentifier()); 
     ruleCondition.setRuleOperator(ruleOperator); 
    } 

    if (ruleCondition.getField() != null) { 
     Field field = fieldManager.getFieldByName(ruleCondition.getField().getName()); 
     ruleCondition.setField(field); 
    } 

    ruleService.saveCondition(ruleCondition); 

} 

当我坚持的数据,我遇到了以下错误:

Unique index or primary key violation: "UK_QG4N8FT2CPEX15N36TM2SRXPN_INDEX_1 ON PUBLIC.EDITOR_REGRA_CONDICAO(FIELD) VALUES (1, 1)"; SQL statement: insert into editor_regra_condicao (field, next_condition, connector, operator, value, id) values (?, ?, ?, ?, ?, ?) [23505-193]

+0

它似乎是你插入一个fieldid已经存在..并有独特的约束seet你会得到错误 –

+0

是否有可能在错误的位置你已经有一个RuleCondition为同一个字段?由于这是一对一的关系,因此您不允许有多个关系。 –

回答

0

从上下文,似乎正在插入的RuleCondition被链接到已链接到该RuleCondition一个Field

one-to-one关系,这是不允许的(顾名思义这种关系仅限于单个关系)

为了解决这个问题要么

使用棒球场many-to-one关系:

@ManyToOne(fetch = FetchType.LAZY, optional = false) 
@JoinColumn(name = "field", nullable = false) 
private Field field; 

或者确保您没有指向每个保存前已经有一个RuleCondition链接到的字段的链接。

+0

谢谢@Ovidu Dolha, 我修改了我的对象与manyToOne的关系 –