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;
}
誰にも、なぜこれが当てはまるのか、どうすれば解決できるのでしょうか?
ありがとうございます!
:
のコードは次のようになります。 – MaDa
エンティティが2回保存された例:home RideSingleとTimedRouteLocationのインスタンスが具体的な関連付けに存在し、合計はいくつですか? – Ralph
@マダ私はexcertsを追加しました。これは役に立ちますか? –