класс rideSingle всегда сохраняется несколько раз в БД, если для отношения OneToMany установлено значение eager:
Класс, который сохраняется
@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;
}
Спящий базовый класс
@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
Дао выглядит так:
public T saveOrUpdate(T object) {
getSession().saveOrUpdate(object);
return object;
}
Если rideSingle.route имеет 2 элемента -> rideSingle помещается дважды в БД. Если в маршруте 3 элемента, в базу данных заносятся 3 копии rideSingle ...
Если поездка по одному загружается по маршруту ленивый, эта проблема не возникает.
@Entity
public class RideSingle {
@OneToMany(mappedBy = "rideSingle", fetch = FetchType.EAGER)
@Cascade(CascadeType.ALL)
protected List<TimedRouteLocation> route;
}
Кто-нибудь знает, почему это так, и как я могу это решить?
Большое спасибо!