2014-12-29 45 views
1

我們必須在那裏由觸發器生成的ID表 -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); 
    } 

,但他們的工作不。我只想在數據庫中插入新記錄,並且不希望稍後使用該id。我使用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

如果您使用的是序列,爲什麼不用觸發器生成值?這樣,你可以確保所有的客戶端將始終使用序列中生成的ID ... –

+0

好主意,這將是一個更好的方法。 –

+0

這會很好,但是如果我將Id設置爲transient,它仍然在插入語句中使用和Id - 這是我的第一種方法 – HamoriZ