2014-12-29 46 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