2

最初の assert ステートメントは成功しますが、2 番目のステートメントは成功しません。コードをステップ実行すると、データベースは各コミットで適切に更新されています。ただし、セカンダリ エンティティ オブジェクトが更新されても、プライマリ エンティティは更新されないように見えます。

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

@OneToMany アノテーションに CascadeType.All を追加したり、セッションをフラッシュしたりするなど、失敗した解決策をいくつか試しました。セカンダリ エンティティがデータベースを保存して変更した後、プライマリ エンティティを更新するにはどうすればよいですか?

私のエンティティクラスは次のようになります:

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

0 に答える 0