2011-11-09 5 views
1

OneToMany関係が熱心に設定されている場合rideSingleは常にDBに複数回保存されているクラスに接続したときにテーブルに二回オブジェクトを保存します。Hibernateは:eagerloaded OneToMany

保存されているクラス

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class RideSingle extends HibernateBasicClass{ 
    @OneToMany(mappedBy = "rideSingle", fetch = FetchType.EAGER) 
    @Cascade(CascadeType.ALL) 
    protected List<TimedRouteLocation> route; 
} 

参照さクラス:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class TimedRouteLocation extends HibernateBasicClass { 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(nullable = false) 
    protected RideSingle rideSingle; 
} 

Hibernateの基本クラス

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class HibernateBasicClass implements Serializable { 
    private static final long serialVersionUID = -2253382207065396453L; 

    @Id 
    @SequenceGenerator(name = "generator", allocationSize = 1, initialValue = 1) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "generator") 
    @JsonProperty 
    private Long id; 

    @Column(nullable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date createdOn = new Date(); 

    @Version 
    private Date lastModified; 

    public HibernateBasicClass() { 
     super(); 
    } 

    public Long getId() { 
     return id; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     final HibernateBasicClass objWId = (HibernateBasicClass) obj; 
     // same id instance 
     if (getId() == objWId.getId()) 
      ; 
     // same id content 
     if (getId() != null) { 
      return getId().equals(objWId.getId()); 
     } else { 
      return false; 
     } 
    } 

} 

その後、ダオはこのようになります

int i = rideSingleDaox.findAll().size(); // i is 0 
    rideSingleDao.saveOrUpdate(this); 
    i = rideSingleDaox.findAll().size(); // i is 2 

によって保存されたただ一つの変数、あります:rideSingle.routeは2つの要素がある場合は

public T saveOrUpdate(T object) { 
    getSession().saveOrUpdate(object); 
      return object; 
} 

- > rideSingleが二度入れているが、データベース。ルートに3つの要素がある場合、rideSingleの3つのコピーがデータベースに格納されます。

rideSingleがルート遅延をロードする場合、この問題は発生しません。

@Entity 
public class RideSingle { 
    @OneToMany(mappedBy = "rideSingle", fetch = FetchType.EAGER) 
    @Cascade(CascadeType.ALL) 
    protected List<TimedRouteLocation> route; 
} 

誰にも、なぜこれが当てはまるのか、どうすれば解決できるのでしょうか?

ありがとうございます!

+0

のコードは次のようになります。 – MaDa

+0

エンティティが2回保存された例:home RideSingleとTimedRouteLocationのインスタンスが具体的な関連付けに存在し、合計はいくつですか? – Ralph

+0

@マダ私はexcertsを追加しました。これは役に立ちますか? –

答えて

-1

唯一の推測です:

てみてください、両方のクラスのequalsメソッドを実装します。

+0

@スティーブあなたはそれについて覚えていましたか? – MaDa

+0

@MaDa:どういうことですか? – Ralph

+0

@Ralphこれは良い考えです!私はちょうど等しい(RideSingle rideSingle)メソッドを持っていた。今、私はHibernateBasicClassに1つ追加しました。しかし、それは問題を助けるものではありません。さらなるヒントはありますか? –

0

持続性の後にリストを呼び出すときも同じ問題がありました。 同じオブジェクトを複数回返しました。

私は、この問題を解決するために

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

を追加しました。 `@のId`の定義と複数のレコードが保存されるようにするコードの抜粋を使用しての例を拡張してください

session.createCriteria(clazz) 
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
.list() 
関連する問題