2

エンティティをデータベースに挿入する際に問題に直面しています。私はHibernate JPAを使用しています。これが私のデータベース構造です:

Table : User {CGU_USER_ID as PK}
Table : Industries {CGI_INDUSTRY_ID (PK),CGI_INDUSTRY_NAME}
Table : USER_INDUSTRY_MAP {CUIM_USER_ID (FK),CUIM_INDUSTRY_ID (FK)}

ここに私のマッピングがあります:

@JoinTable(name = "USER_INDUSTRY_MAP", joinColumns = @JoinColumn(name = "CUIM_USER_ID", referencedColumnName = "CGU_USER_ID"), inverseJoinColumns = @JoinColumn(name = "CUIM_INDUSTRY_ID"))
@OneToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER)
private List<Industry> industrySet;

私が得ている例外は言う:

org.springframework.dao.DataIntegrityViolationException: could not insert collection: [com.keff.gg.domain.User.industrySet#1242]; SQL [insert into CG_USER_INDUSTRY_MAP (CUIM_USER_ID, CUIM_INDUSTRY_ID) values (?, ?)]; constraint [CUSTOMERGATEWAY.FK_CUIM_USER_ID]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert collection: [com.keff.gg.domain.User.industrySet#1242]

Caused by: java.sql.SQLException: ORA-02291: integrity constraint (CUSTOMERPROJECT.FK_CUIM_USER_ID) violated - parent key not found

ここに私の挿入コードがあります:

User user = new User();
query = session.createQuery("from Industry industry where industry.industryName=:industryName");
        query.setParameter("industryName", "validIndstry");
        results = (List<?>) query.list();
        if(results != null && results.size()>0){
            industryList = (List<Industry>)results;
        }
user.setIndustrySet(industryList); // If this is set to null then insert into User table is successfull
Long id = (Long) hibernateTemplate.save(user);

誰かが私のマッピングを見て、私が間違っていることを教えてもらえますか? 私を助けてください。私は冬眠するのがとても初めてです。問題を追跡するためにさらに情報が必要な場合はお知らせください。

アップデート - - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------------ 私は多対多で双方向の関係を作ってみました

//User Class
@JoinTable(name = "CG_USER_INDUSTRY_MAP", joinColumns = @JoinColumn(name = "CUIM_USER_ID", referencedColumnName = "CGU_USER_ID"), inverseJoinColumns = @JoinColumn(name = "CUIM_INDUSTRY_ID"))
@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER)
private List<Industry> industrySet;

//Industry Class
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "industrySet")
private List<User> userSet;

しかし、それでも同じ問題が発生します。

4

2 に答える 2

6

私が直面していた問題の根本的な原因を見つけました。

挿入のたびにユーザーシーケンスを更新するトリガーがユーザーテーブルにありました。それが問題の原因だったと思います。トリガーを無効にした後、問題なくユーザーエンティティを正しく保存できることがわかります。

いつもありがとうございました。

于 2013-01-03T09:21:13.627 に答える
0

永続操作を使用しているため、マッピングにカスケード オプションがあることを確認してください。CascadeType.PERSIST を持続オプションに追加して、これを機能させることができます。

@OneToMany(cascade = {  CascadeType.MERGE, CascadeType.REMOVE ,CascadeType.PERSIST })
@JoinTable(name = "USER_INDUSTRY_MAP", joinColumns = { @JoinColumn(name = "CUIM_USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "CUIM_INDUSTRY_ID") })
private List<Industry> industries = new ArrayList<Industry>();

CascadeType.ALL を使用して、関連付けに対してすべての操作をカスケードする必要があることを指定することもできます。

于 2012-12-27T17:01:05.913 に答える