2014-12-29 7 views
1

У нас есть таблица, где идентификатор генерируется триггер -JPA - первичный ключ префикс

ID = год + месяц + последовательностями

Я сопоставляюсь таблица с помощью JPA и я хотел бы для использования того же поколения PK в моем коде. Я попытался следующие варианты:

@Id 
    @SequenceGenerator(name = "assetSeq", sequenceName = "ASSET_SEQ") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "assetSeq") 
    @Transient 
    private long id; 

, а также пытались изменить сеттер

public void setId(long id) { 

     String finalId=getIdPrefix()+id; 
     this.id = Long.parseLong(finalId); 

    } 

    private String getIdPrefix() { 
     DateFormat df = new SimpleDateFormat("YYYYMM"); 
     Date today = Calendar.getInstance().getTime(); 
     return df.format(today); 
    } 

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

ответ

1

Вы можете сделать это, если вы реализуете собственный генератор Hibernate. This blog имеет почти идентичный пример того, что вам нужно. Я отправлю сюда код из блога скорректированного с вашими потребностями (не может работать, если скопировать и вставить его, но это будет близко)

public class CustomIdGenerator implements IdentifierGenerator { 

    public Serializable generate(SessionImplementor session, Object object) 
      throws HibernateException { 

     String prefix = getIdPrefix(); 
     Connection connection = session.connection(); 
     try { 

      PreparedStatement ps = connection 
        .prepareStatement("SELECT nextval ('ASSET_SEQ') as nextval"); // could be different, depending on database vendor 

      ResultSet rs = ps.executeQuery(); 
      if (rs.next()) { 
       int id = rs.getInt("nextval"); 
       String code = prefix + id; 
       return code; 
      } 

     } catch (SQLException e) { 
      throw new HibernateException(
        "Unable to generate ID"); 
     } finally { 
      if (ps != null) { 
       try { 
        ps.close(); 
       } catch (Throwable e) { 
        // log error, or rethrow exception 
       } 
      } 
     } 
     return null; 
    } 

    private String getIdPrefix() { 
     DateFormat df = new SimpleDateFormat("YYYYMM"); 
     Date today = Calendar.getInstance().getTime(); 
     return df.format(today); 
    } 

} 

@Id 
@GenericGenerator(name="seq_id", strategy="my.package.CustomIdGenerator") 
@GeneratedValue(generator="seq_id") 
// don't put that @Transient here 
private long id; 

Надеется, что это помогает.

+0

Если вы используете последовательность, почему бы не генерировать значение с помощью триггера? Таким образом, вы можете гарантировать, что все клиенты всегда будут использовать сгенерированные идентификаторы из последовательности ... –

+0

Хорошая идея, это был бы лучший подход. –

+0

Было бы хорошо, но если бы я установил Id в переходный режим, он все еще использует и Id в инструкции insert - это был мой первый подход. – HamoriZ

Смежные вопросы