2017-05-03 6 views
0

Nun, ich bin der Frühling Boot mit JPA und ich habe eine Entität, die die gleiche Einheit wie Kind unten, wie nextCondition vom Typ RuleCondition beschrieben enthält:Fremdschlüssel Kind in One To One Beziehung in JPA wintern

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

ist die Regel Zustandsregler

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

Und Finalisierung das ist die Klasse für die Verwaltung Regelbedingung Operationen:

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); 

} 

Wenn ich die Daten am persistierenden, ich Begegnung mit den folgenden Fehlern:

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

Es scheint, dass Sie mit einer Feldkennung einfügen, die bereits existiert .. und mit eindeutigen Einschränkung seet erhalten Sie den Fehler –

+0

Ist es möglich, dass an der Stelle des Fehlers haben Sie bereits eine RuleCondition für das gleiche Feld? Da es sich um eine Eins-zu-eins-Beziehung handelt, dürfen Sie nicht mehrere haben. –

Antwort

0

Aus dem Kontext scheint es, dass die RuleCondition ist mit einem Field verbunden ist eingefügt, das bereits ein RuleCondition mit ihm verbunden hat.

Auf one-to-one Beziehungen ist dies nicht erlaubt (solche Beziehungen zu einzelnen Beziehungen beschränkt sind, wie der Name schon sagt)

Um dies zu beheben, entweder

eine many-to-one Beziehung für den Feldeinsatz:

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

ODER stellen Sie sicher, dass Sie keine Verbindung zu einem Feld haben, mit dem bereits vor jedem Speichern eine RuleCondition verknüpft ist.

+0

Danke @Ovidu Dolha, Ich habe die Beziehungen meiner Objekte zu manyToOne geändert –