Hibernate: дважды сохраняет объект в таблицу при соединении с загруженным OneToMany - PullRequest
1 голос
/ 09 ноября 2011

класс 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;
}

Кто-нибудь знает, почему это так, и как я могу это решить?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 13 августа 2012

У меня была такая же проблема при вызове списка после персистирования. Он возвращал один и тот же объект более одного раза.

Я добавил

.setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY)

чтобы решить эту проблему.

Код выглядит так:

session.createCriteria(clazz)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list()
0 голосов
/ 09 ноября 2011

Это только предположение:

Попробуйте реализовать метод equals для обоих классов.

...