2017-06-13 5 views
0

は私がは、私はそれが保存されます前に、カスケードManyToOne関係が子エンティティを検索してもらうことはできますか?

@Entity 
@Table(name = "currency", uniqueConstraints = {}) 
public class Currency { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "CURRENCY_ID") 
    private Integer currencyId; 

    @NaturalId 
    @Column(name = "CURRENCY_CODE") 
    private String code; 
} 

@Entity 
@Table(name = "price", uniqueConstraints ={}) 
public class Price{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "PRICE_ID") 
    private Integer priceId; 

    @Column(name= "AMOUNT") 
    private Double amount; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @Cascade({CascadeType.ALL}) 
    @JoinColumn(name = "CURRENCY_ID", nullable = false) 
    private Currency currency; 
} 

を持っていると私はすでにGBPの通貨コードと通貨テーブルに通貨を持って言うことができますと言うことができます。

、その後、私は現在、私が取得する以下の

Price p = new Price(); 
p.setAmount(3.5); 
p.setCurrency(new Currency("GBP")); 
sessionFactory.getCurrentSession().save(p) 

をしたいと思います:

Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; UK_R07G412IP03G7P3N6P5O2PARG table: CURRENCY 

はそれをルックアップしようとするような方法で休止状態を設定することは可能です操作を保存し、コードGBPとの通貨がすでに存在する場合、それは価格だけのオブジェクトにその通貨のIDを設定しますカスケード接続しようとしているの前にコードGBPとの通貨?私はそれはあなたが欲しいものを行うことは可能だと思ういけない

答えて

0

、あなたは価格オブジェクトに渡す前に、あなたの通貨のエンティティを取得する必要があります。 例:

Currency curr = (Currency) session.bySimpleNaturalId(Currency.class).load("GBP"); 
    if (curr == null) 
     curr = new Currency("GBP"); 
    p.setCurrency(curr); 

この方法は、あなたは問題ないはずです

関連する問題

 関連する問題