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

У меня есть класс ужина сущностей, который я не могу изменить, и он содержит целое число, зарегистрированное как OID (первичный ключ). как вы знаете, целое число может иметь значения от -2 147 483 648 до 2 147 483 647, и весь этот диапазон используется сейчас. к сожалению, я не могу изменить целочисленный тип на длинный. поэтому спящий режим начинает создавать другой действительный ключ между этим диапазоном, но оракул говорит, что это уникальное нарушение ограничения. любая идея будет оценена. Класс сущности:

@MappedSuperclass
public abstract class EtVersionlessEntity
{
  private Integer oid;

  @Id
  public Integer getOid()
  {
    return this.oid;
  }

Тип столбца Oracle — NUMBER (10).


person hamed.jahanyan    schedule 22.03.2020    source источник
comment
Мне было бы любопытно узнать, какой у вас набор данных, в котором 4 миллиарда записей...   -  person Jeffrey Kemp    schedule 23.03.2020
comment
это технические значения для страхования.   -  person hamed.jahanyan    schedule 23.03.2020


Ответы (2)


Измените тип данных на что-то, что может содержать большие значения.

к сожалению, я не могу изменить целочисленный тип на длинный.

Тогда вы застряли; вам нужно использовать больший тип данных, но вы не хотите/не можете этого сделать, поэтому у вас закончилось место.

Вы либо:

  • Смиритесь с тем, что типы данных не изменятся и что у вас закончились уникальные значения; или
  • Вы увеличиваете размер используемого типа данных, чтобы иметь больший диапазон значений.
person MT0    schedule 22.03.2020
comment
Спасибо. Есть ли какие-либо идеи об изменении базы данных из-за моей доступности для изменения БД. какое-то разделение или... - person hamed.jahanyan; 22.03.2020

кто-то дал мне решение, которым я хотел бы поделиться в качестве ответа:

  1. создайте класс, аналогичный классу, который находится в файле jar (с тем же именем и пакетом)
  2. удалите «расширения» и определите переменную с тем же именем, что и родитель типа long:

    private long oid; 
    @Id
    public long getOid()
    {
       return this.oid;
    }
    

    3. перейдите в файл ORM и добавьте все спецификации для ключа, подобного тому, который определен для родителя.

    <mapped-superclass class="EtEntity">
          <attributes>
             <id name="oid">
                <generated-value generator="HI_LO_SEQ" strategy="TABLE" />
                <table-generator name="HI_LO_SEQ" allocation-size="1000"/>
             </id>
         </attributes>
    </mapped-superclass>
    
  3. изменить столбец БД, чтобы принимать длинные значения (ЧИСЛО (19))

и это все! работал...

person hamed.jahanyan    schedule 23.03.2020
comment
к сожалению, я не могу изменить целочисленный тип на длинный. ... так что это не совсем решение, не так ли? - person Jeffrey Kemp; 24.03.2020
comment
это решение. Я не мог изменить файл jar, но этот способ похож на переопределение класса, которого я не знал. - person hamed.jahanyan; 24.03.2020