有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA主键前缀

我们有一个表,其中ID由触发器生成-

ID = year+month+sequence

我通过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) 个答案

  1. # 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;
    

    希望这有帮助