2016-06-21 2 views
0

デタッチされたエンティティでsave()を呼び出すと、1対多の関係の内容を置き換えたいだけですが、新しいオカレンスを追加し、古いオカレンスを削除しません(エンティティをデータベース)。デタッチされたエンティティを保存し、1対多のリレーションシップの内容を置き換えるにはどうすればいいですか?

エンティティをロード/アタッチせずに関係をクリアする設定はありますか?

私はspring-data-jpaを使用しています。ここで

は私のサービスです。

@Component 
@Transactional 
public class StuffService { 
    @Autowired 
    StuffDao stuffDao; 

    public void save(StuffDto stuffDto) { 
     // The converter maps the properties into the entity, id included 
     Stuff stuff= stuffConverter.dtoToBo(stuffDto); 
     stuffDao.save(stuff); 
    } 
} 

のDTO

public class StuffDto { 
    private Long id; 

    @NotNull(message = "products-empty") 
    @Valid 
    private List<ProductStuffDto> products; 
} 

public class ProductStuffDto { 
    Integer order; 

    String name; 
} 

エンティティ

@Entity 
public class Stuff { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @OneToMany(mappedBy = "stuff", cascade = CascadeType.ALL) 
    private List<ProductStuff> products; 
} 

@Entity 
public class ProductStuff { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "stuff_id", nullable = false) 
    private Stuff stuff; 

    Integer order; 

    String name; 
} 

ダオ

public interface StuffDao extends JpaRepository<Stuff, Long> {} 

ご協力いただきありがとうございます。

+0

JPAプロバイダは、リストを取得せずにリストへの追加を検出できるように変更追跡をサポートしている可能性があります。あなたは何を使っていますか? – Chris

+0

Chrisさん、JPAプロバイダはHibernateです。私はその方法で解決策を見つけました。私の答えを以下に見てください(そして私の質問を見てくれてありがとう) – Lilian

答えて

0

解決策が見つかりました! 孤児の削除を追加する必要がありました。

@OneToMany(mappedBy = "stuff", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 

私はいつもCascade.REMOVEがCascade.ALLに含まれるものの、同じ効果を持っていたので、それは奇妙だ...とにかく

、私は今、デタッチ状態でエンティティを保存し、その関係を置き換えることができます。

ありがとうございました

関連する問題