отображение коллекции hibernate со списком и классом супер сущностей - PullRequest
0 голосов
/ 07 августа 2009

здесь я снова в своем проекте самообучения и личного эксперимента, чтобы получить больше понимания. Вот описание моей среды: У меня есть супер модель сущности, что все мои модели наследуют от .it имеет только свойство id я использую шаблон genericDAO, найденный на веб-сайте hibernate. Теперь моя проблема заключается в том, что я использую список вместо набора для сопоставления «один ко многим» (здесь нет необходимости избегать дублирования), и когда я ссылаюсь на идентификатор супер сущности в свойстве list index или list-index, у меня возникает эта ошибка: org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом вот интерфейс супер сущности

public interface Model extends Serializable {
public Long getId();
public void setId(Long id);
}

//here is its implementation.they are not in the same physical file
public abstract class ModelImpl implements Model {
private Long id;
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}

}

вот файл сопоставления

<class abstract="true" name="ModelImpl">
<!--i removed doctype and stuffs-->
<id name="id">
  <generator class="assigned"/>
</id>
</class>

вот на интерфейсе pojo это мой родитель

public interface Message extends Model {
Date getDateSent();
String getGlobalStatus(); 

} // его реализация здесь, но в другом физическом файле открытый класс MessageImpl расширяет ModelImpl реализует сообщение { приватная строка globalStatus; закрытый ответ в ответе = новый ArrayList (); приватная дата dateSent; // сеттеры и геттеры .... }

его файл сопоставления выглядит так:

<union-subclass extends="ModelImpl" name="MessageImpl">
<property name="globalStatus"/>
<property name="dateSent" type="timestamp"/>

->

я прокомментировал набор, потому что ему дали ошибку приведения, которая заставляет меня понять мою ошибку поэтому класс Response, являющийся родительским, находится здесь:

public interface Response extends Model {
String getGatewayMessageId();
Message getMessageId();
}
//its implementation but in different physical file
public class ResponseImpl extends ModelImpl implements Response{

private static final long serialVersionUID = 1L;

private Message messageId;
private String gatewayMessageId;
//setters and getters..
}

так что это в основном то. Теперь во время моего теста, когда я пытаюсь сохранить сообщение с его потомками, оно выдает следующее:

org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом

Я могу использовать все методы, связанные с сохранением данных, кроме того, о котором я только что говорил. я немного растерялся, потому что все они наследуют идентификатор модели, так что я делаю не так? спасибо за чтение. Я не совсем понимаю проблему здесь.

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

решить это. У меня есть менеджер (который создает pojos и daos), который внедряет новый Id в каждый вновь создаваемый POJO. И во время тестирования я добавляю id вручную. Спасибо за вашу помощь

0 голосов
/ 08 августа 2009

Похоже, вы пытаетесь сохранить сущность с идентификатором, который уже существует. Вы понимаете, что, когда вы используете подход с объединением подклассов, все подклассы, которые у вас могут быть, имеют одинаковое пространство идентификаторов, не так ли?

Купите способ, у вас есть причина для ручного назначения идентификаторов, или сгенерированные идентификаторы помогут?

...