2015-05-12 5 views
0

Мой сценарий очень прост. У меня есть поле entityID идентичности в @Entity класса и БД (Oracle, который я не уверен, что вопросы):Как использовать сгенерированный порядковый номер перед сохранением?

@Id 
@SequenceGenerator(name="ENTITY_SEQ_GEN", sequenceName="SEQ_GENERIC", allocationSize = 1) 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ENTITY_SEQ_GEN") 
@Column(name="ENTITY_ID") 
private long entityID; 

У меня есть еще одно поле с именем, скажем, entityReadableID, и это должно быть строка, состоящая строкового идентификатора объекта, объединенного с другим строковым полем от объекта. Например. если entityID равен , entityReadableID может быть чем-то вроде 1234ABC.

Моя проблема заключается в том, что, насколько мне известно, значение entityID неизвестно до того, как строка создается в БД, но мне нужно объединить entityReadableID, используя его значение. Есть ли способ получить значение идентификатора сгенерированной последовательности до того, как строка будет создана в БД, чтобы я мог использовать ее для генерации другого идентификатора? Я знаю, что могу сделать это вставкой с этим полем, равным нулю, а затем сделать обновление, как только я узнаю, что такое идентификатор сущности, но это решение кажется менее элегантным.

Как я надеюсь, Hibernate/Oracle может поддерживать это, если Hibernate может каким-то образом «зарезервировать/выпустить» следующее сгенерированное значение для обрабатываемой сущности до фактического сохранения, сообщите мне, что это такое. может манипулировать им, а затем в конце упорствовать.

+1

Почему у вас есть это поле в первую очередь? Это избыточно, так как это результат объединения двух других полей. –

+0

, потому что он должен быть сгенерирован по умолчанию, как показано в пользовательском интерфейсе, тогда пользователь может его изменить, если он выбирает – amphibient

+1

. Тогда, боюсь, вам придется упорствовать (и скрывать) объект без этого поля и затем вычислите его. –

ответ

0

Вы можете получить сгенерированный Id перед тем сохраняющиеся это лицо, не используя последовательность непосредственно для этой сущности, я имею в виду использовать отделенный объект для этой последовательности, так что ваша организация должна быть что-то вроде:

@Entity 
@Table(name = "ENTITY" 
) 
public class EntityClass implements java.io.Serializable { 

    private Long entityId; 
    private String entityRelatedId; 

    public EntityClass() { 
    } 
    // you may have other constructors 

    @Id 
    @Column(name = "ENTITY_ID", nullable = false) 
    public Long getEntityId() { 
     return this.entityId; 
    } 

    public void setEntityId(Long entityId) { 
     this.entityId = entityId; 
    } 

    @Column(name = "ENTITY_RELATED_ID", length = 50) 
    public String getEntityRelatedId() { 
     return this.entityRelatedId; 
    } 

    public void setEntityRelatedId(String entityRelatedId) { 
     this.entityRelatedId = entityRelatedId; 
    } 

} 

и сущность для последовательности нечто вроде:

@Entity 
@Table(name = "SEQ_GENERIC_TBL" 
) 
public class SeqGenericTbl implements java.io.Serializable { 

    private Long id; 

    public SeqGenericTbl() { 
    } 

    public SeqGenericTbl(Long id) { 
     this.id = id; 
    } 

    @Id 
    @SequenceGenerator(name = "ENTITY_SEQ_GEN", 
      sequenceName = "SEQ_GENERIC", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ENTITY_SEQ_GEN") 
    @Column(name = "ID") 
    public Long getId() { 
     return this.id; 
    } 

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

} 

Теперь вы можете получить Id от объекта последовательности (упорствовать, вы можете откатить, что Tran или удалить его или очистить связанную таблицу ниже):

SessionFactory sf = HBUtil.getSessionFactory(); 
    Session s = sf.openSession(); 
    SeqGenericTbl sg=new SeqGenericTbl(); 
    s.save(sg); 

    EntityClass entity1 = new EntityClass(); 
    entity1.setEntityId(sg.getId()); 
    //NOW YOU HAVE THE ID WITHOUT PERSISTING THE ENTITY 
    System.out.println(entity1.getEntityId()); 
Смежные вопросы