【问题标题】:JPA - Primary key prefixJPA - 主键前缀
【发布时间】:2015-02-25 17:57:04
【问题描述】:

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

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

【问题讨论】:

    标签: java 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;
    

    希望这会有所帮助。

    【讨论】:

    • 如果您使用的是序列,为什么不使用触发器生成值?这样,您可以确保所有客户端将始终使用从序列中生成的 ID...
    • 好主意,那会是更好的方法。
    • 这会很好,但是如果我将 Id 设置为瞬态,它仍然在插入语句中使用和 Id - 这是我的第一个方法
    • 在 JPA 中有什么方法可以做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2011-02-28
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多