Другой идентификатор сущности сохраняется в Hibernate - PullRequest
0 голосов
/ 06 апреля 2011

Когда я создаю новый объект без идентификатора и сохраняю его в базе данных, объект получает идентификатор, отличный от идентификатора в базе данных.ID генерируется с помощью последовательности в Oracle.Любой совет, как решить это?Спасибо за ответ.

Пример: я создаю обзор DiReview = new DiReview ().Я правильно установил все поля, кроме идентификатора. Я хочу, чтобы hibernate сохранялся через getSessionFactory (). GetCurrentSession (). Persist (), просматривал базу данных, и я хочу, чтобы hibernate установил правильный идентификатор.Предположим, что последний идентификатор, сгенерированный последовательностью оракула, был 25, поэтому я предполагаю, что новая строка в таблице DI_REVIEW будет 26. После сохранения и принятия в таблицу действительно сохраняется новая строка с идентификатором 26, но для идентификатора поля в обзоре установленодругой номер.В моем случае, например, 2000!Это нормально?

Эта проблема в моем случае связана не только с DiReview, но и со всеми моими сущностями.Когда я загружаю сущности из базы данных, они загружаются с идентификатором corect.

Редактировать - я пытался реализовать этот пример , используя оракул и последовательность, и по крайней мере теперь я знаю, что это не нормальное поведение; -)

@Entity
@Table(name = "DI_REVIEW", uniqueConstraints = @UniqueConstraint(columnNames = {
        "OBJECT_ID", "USER_ID" }))
public class DiReview{

    private Long id;
    private DiUser user;
    private DiObject object;
    private String text;
    private Date createDate;

    private Set<DiRating> ratings = new HashSet<DiRating>(0);
    private Set<DiReviewContext> reviewContexts = new HashSet<DiReviewContext>(
            0);

    private Collection<DiReviewContext> reviewContextsList = new ArrayList<DiReviewContext>();
    private Set<DiComment> comments = new HashSet<DiComment>(0);

    public DiReview() {
    }

    public DiReview(Long id, DiUser user, DiObject object, String text,
            Date createDate) {
        this.id = id;
        this.user = user;
        this.object = object;
        this.text = text;
        this.createDate = createDate;
    }

    @Id
    @Column(name = "ID", unique = true, nullable = false, precision = 18, scale = 0)
    @SequenceGenerator(name = "di_review_seq", sequenceName = "DI_REVIEW_SEQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "di_review_seq")
    public Long getId() {
        return this.id;
    }

    getters and setters ..

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((createDate == null) ? 0 : createDate.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((object == null) ? 0 : object.hashCode());
        result = prime * result + ((text == null) ? 0 : text.hashCode());
        result = prime * result + ((user == null) ? 0 : user.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        DiReview other = (DiReview) obj;
        if (createDate == null) {
            if (other.createDate != null)
                return false;
        } else if (!createDate.equals(other.createDate))
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (object == null) {
            if (other.object != null)
                return false;
        } else if (!object.equals(other.object))
            return false;
        if (text == null) {
            if (other.text != null)
                return false;
        } else if (!text.equals(other.text))
            return false;
        if (user == null) {
            if (other.user != null)
                return false;
        } else if (!user.equals(other.user))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "DiReview [id=" + id + ", user=" + user + ", object=" + object
                + ", text=" + text + ", createDate=" + createDate + "]";
    }

}

    public T makePersistent(T entity) {
    try {

        getSessionFactory().getCurrentSession().persist(entity);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return entity;
}

1 Ответ

0 голосов
/ 07 апреля 2011

Я не уверен, что это ответит на ваш вопрос, но при использовании генераторов последовательности Hibernate по умолчанию выделяет блок из 50 значений ID одновременно, что может означать, что он не может получить значение последовательности, которое вы могли быожидать.Вы можете изменить это, изменив аннотацию для @SequenceGenerator следующим образом:

@SequenceGenerator(name = "di_review_seq", sequenceName = "DI_REVIEW_SEQ", 
        allocationSize = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...