如何使用jpa在一个表中实现两个序列

时间:2016-04-30 06:03:21

标签: sql hibernate postgresql jpa jpql

我在数据库中有一个表发票,映射到我的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(男性)然后收据num 1

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

第三项 - 用户:Sarah(女),然后收据num 1

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

第五项 - 用户:Casie(女)然后收到第2号

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

所以如何使用JPA在mydatabase中实现这一点。我正在使用PostgresSQL。

2 个答案:

答案 0 :(得分:0)

先生,这是一个很好的问题,许多开发人员使用解决方案,因为我多次使用它。为此,您需要使用Custom Generator for 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;
    }

}

答案 1 :(得分:0)

使用-> columnDefinition =“ serial”添加列很完美,但仅适用于PostgreSQL。

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