Может ли @TableGenerator сохранить последний использованный идентификатор в таблице вместо следующего доступного? - PullRequest
3 голосов
/ 10 июня 2011

Мне нужно подключиться к базе данных поставщика и вставить данные клиента.В таблице последовательности, используемой для создания новых идентификаторов клиентов, хранится последний использованный идентификатор (а не следующий доступный).Я не смог найти в документах jpa или hibernate ничего, что указывало бы на способ сказать hibernate обрабатывать идентификатор в таблице seq как последний использованный вместо следующего доступного (при использовании @TableGenerator).

Do IВам нужно написать собственный генератор, который будет вести себя по существу так же, как @TableGenerator, с той лишь разницей, как обрабатывается значение в таблице последовательности?

Сущность My Customer определяется следующим образом:

@Entity
public class Customer {

    @Id
    @TableGenerator(name = "cust_gen", table = "SEQUENCE", pkColumnName = "target",
        pkColumnValue = "customer", valueColumnName = "id", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "pat_gen")
    public long getCustomer_id() {
          return customer_id;
    }

    public void setCustomer_id(Long id) {
    this.customer_id = id;
}

    ...

}

Спасибо!

1 Ответ

3 голосов
/ 18 мая 2012

У меня была такая же проблема. Исправлено это так: Используйте Hibernate org.hibernate.annotations.GenericGenerator вместо персистентности TableGenerator следующим образом:

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "name")
public class Name implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "names")
@GenericGenerator(name = "names", strategy = "com.ourpackage.SybaseTableGenerator", parameters = {
        @Parameter(name = "table_name", value = "new_key_numbers"),
        @Parameter(name = "value_column_name", value = "key_number"),
        @Parameter(name = "segment_column_name", value = "name"),
        @Parameter(name = "segment_value", value = "names_key") })
@Column(name = "names_id")
private Long id;

И создайте свой собственный генератор (я использовал имя com.ourpackage.SybaseTableGenerator):

import java.io.Serializable;

import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.enhanced.TableGenerator;

@SuppressWarnings("UnusedDeclaration")
public class SybaseTableGenerator extends TableGenerator {

    @Override
    public synchronized Serializable generate(SessionImplementor session, Object obj) {
        return (Long) super.generate(session, obj) + 1;
    }
}

Немного сложно, но это работает;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...