2016-07-31 3 views
0

Ich habe eine "Category" -Entität, die auf self verweist.Selbstreferenzierende Einheit fügt zwei Datensätze ein

@Entity 
public class Category extends NamedEntity { 

    private String slug; 

    private int position; 

    @ManyToOne(cascade = { CascadeType.PERSIST }) 
    private Category parent; 

    @OneToMany(mappedBy = "parent") 
    private Set<Category> children = new HashSet<Category>(); 

    ... getters/setters ... 

Wenn ich an das Unternehmen zu speichern, die keine Eltern hat, fügt er "zwei" Datensätze:

| ID | NAME | POSITION | SLUG | PARENT_ID |

| 1 | 1 | 1 | 1 | 2 |

| 2 | null | 0 | null | null |

Ich wollte "eins" Datensatz, dessen PARENT_ID Null ist, aber es fügt den Datensatz (ID = 2) und den Datensatz (ID = 1) als Kind eingefügt.

speichere ich den Rekord mit Spring-Data JPA-Schnittstelle API:

public interface CategoryRepository extends Repository<Category, Long> { 
    public Category findById(Long id) throws DataAccessException; 
    public Category save(Category category) throws DataAccessException; 
} 

Antwort

0

ändern Mapping für parent an folgenden und wird es nicht.

@ManyToOne 
private Category parent; 

Der Grund, warum Sie dieses Verhalten beobachten ist, dass die CascadeType.PERSIST wird für Sie eine neue leere Kategorie erstellen, anstatt Hibernate nur mit einem null'd Elternteil das Kind Datensatz erstellt.

+0

Wenn ich die Kaskadenoption lösche, tritt '' 'TransientPropertyValueException''' Ausnahme auf. Deshalb habe ich '' 'CascadeType.PERSIST''' gesetzt. Beschreibung der Ausnahmebedingung ist '' 'Objekt verweist auf eine nicht gespeicherte vorübergehende Instanz - speichern Sie die vorübergehende Instanz beforeQuery flushing'''. Vielen Dank. – nasiajai

+0

Es sollte sich nicht beschweren, wenn Sie den Wert explizit auf "null" setzen. – Naros

+0

Es tut mir leid, dass ich sagen muss, es ergibt sich das gleiche. – nasiajai

Verwandte Themen