Двунаправленное отображение гибернации, сохранение дочернего элемента не обновляет родительский

Первое утверждение assert проходит, а второе - нет. Пошагово просматривая код, база данных корректно обновляется при каждом коммите. Однако первичный объект не обновляется при обновлении объекта вторичного объекта.

Entity secondary = (Entity) session.get(Entity.class, 2);            
secondary.setPrimary(null); 
session.beginTransaction();
session.save(secondary);
session.getTransaction().commit();

Entity primary = (Entity) session.get(Entity.class, 1);
secondary.setPrimary(primary);
session.beginTransaction();            
session.save(secondary);
session.getTransaction().commit();

Set<Entity> secondarySet;

// If I comment out these two lines, the next assert passes.
secondarySet = primary.getSecondarySet();
assertFalse(secondarySet.isEmpty());

secondary.setPrimary(null);       
session.beginTransaction();            
session.save(secondary);
session.getTransaction().commit();

primary = (Entity) session.get(Entity.class, 1);
secondarySet = primary.getSecondarySet();
assertTrue(secondarySet.isEmpty());

Я пробовал несколько неудачных решений, таких как добавление CascadeType.All к аннотации @OneToMany и очистка сеанса. Как я могу обновить свою первичную сущность, когда вторичная сущность сохраняет и изменяет базу данных?

Мой класс Entity выглядит так:

@Entity
@DynamicInsert
@DynamicUpdate
@Table(catalog = "catalog", name = "Entity")
public class Entity implements java.io.Serializable {

    private int id; 
    private Entity primary;
    private Set<Entity> secondarySet;

    public Entity() {
    }

    @Id
    @Column(name = "ID_", unique = true, nullable = false)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @OneToMany(mappedBy = "primary")
    public Set<Entity> getSecondarySet() {
        return this.secondarySet;
    }

    public void setSecondarySet(Set<Entity> secondarySet) {
        this.secondarySet = secondarySet;
    }

    /**
     * @return primary client if it exists, otherwise null
     */
    @ManyToOne(cascade = CascadeType.ALL)
    @NotFound(action = NotFoundAction.IGNORE) // can be it's own primary
    @JoinTable(catalog = "catalog", name="entitylink",
          joinColumns = {@JoinColumn(name="secondaryid_")},
          inverseJoinColumns = {@JoinColumn(name="primaryid_")})    
    public Entity getPrimary() {
        return this.primary;
    }

    public void setPrimary(Entity primary) {
        this.primary = primary;
    }
}

0 ответов

Другие вопросы по тегам