【问题标题】:How to implement two sequences in one table using jpa如何使用jpa在一个表中实现两个序列
【发布时间】:2016-08-25 09:15:12
【问题描述】:

我在数据库中有一张表 invoices,它映射到我的 java 类 invoice.java,如下所示。

@Entity
@Table(name = "invoices")
public class Invoice implements Serializable {

@Id
@GeneratedValue(generator = "my_seqinvoice")
@SequenceGenerator(name = "my_seqinvoice", sequenceName = "MY_SEQINVOIVE",     allocationSize = 1)
private Long invoiceId;

private String invoiceType;

private String receiptNumber;

private Long amount;

private Long totalAmount;

private Date invoiceDate;

private String paymentType;

@ManyToOne
@JoinColumn(name = "userId")
private User user;

}

我想按顺序生成收据编号,但我有两个序列。

收据顺序取决于用户类型。 如果用户是男性,那么我想使用第一个序列,如果用户是女性,那么我想使用第二个序列。

例如...

在发票表中

第一个条目 - 用户:James(男性)然后收据编号 1

第二个条目 - 用户:Andrew(男)然后收据编号 2

第三个条目 - 用户:Sarah(女性)然后收据编号 1

第四个条目 - 用户:Slawomir(男性)然后收据编号 3

第五个条目 - user:Casie(female) 然后收据编号 2

对于一个用户,有两种类型的收据,但两种收据的收据编号相同

那么如何使用 JPA 在我的数据库中实现这个。我正在使用 PostgresSQL。

【问题讨论】:

    标签: sql hibernate postgresql jpa jpql


    【解决方案1】:

    先生,这是一个很好的问题,许多开发人员都在使用解决方案,因为我多次使用它。为此,您需要为 Id 使用自定义生成器。这是我的实现。 创建两个名为 MALE_SEQ 和 FEMALE_SEQ 的序列。

     @Entity
     @Table(name = "invoices")
     public class Invoice implements Serializable {
        @Id
        @GenericGenerator(name="invoice_id",strategy="com.sunixi.InvoiceKeyGenerator")
        @GeneratedValue(generator = "invoice_id")
        private Long invoiceId;
        //------rest of variables
        //getter setter
     }
    
        //The custom generator
        public class InvoiceKeyGenerator implements IdentifierGenerator {
          public Serializable generate(SessionImplementor session,Object obj) throws HibernateException{
            Invoice invoice=(Invoice) obj;
            Connection con=session.conncetion();
            String seqName=""
            if(invoice.getUser().getGender().equals("M"){
              seqName="MALE_SEQ";
            }else{
              seqName="FEMALE_SEQ";
            }
          try{
              PreparedStatement ps=conn.preparedStatement("SELECT nextval('"+seqName+"')";
              ResultSet rs=ps.executeQuery();
           if(rs.next()){
              int id=rs.getInt("nextval");
              return id;
            }
    
           }catch(SQLException e){
             e.printStackTrace();
           }
          return null;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      使用 -> columnDefinition = "serial" 添加一列非常完美,但仅适用于 PostgreSQL。

      @Column(name = "name_column", columnDefinition = "serial")
      @Generated(GenerationTime.INSERT)
      private String nameColumn;
      

      【讨论】:

        猜你喜欢
        • 2010-09-09
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        相关资源
        最近更新 更多