2016-04-30 28 views
1

我有一個表發票在數據庫中映射到我的java類invoice.java如下。如何使用jpa在一個表中實現兩個序列

@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; 

} 

我想按順序生成收據編號,但我有兩個序列。

收據順序取決於用戶類型。 如果用戶男性,那麼我想用戶第一序列,如果用戶是女性,那麼我想使用第二序列。

作爲示例...

發票表

第一個項目 - 用戶:詹姆斯(男),那麼收據號碼1

第二個條目 - 用戶:安德魯(男),那麼收據號碼2

第三項 - 用戶:薩拉(女),那麼收據號碼1

第四個條目 - 用戶:SLA womir(雄性),然後接收號碼3

第五項 - 用戶:Casie(女)然後收據NUM 2

以及用於一個用戶有兩種類型recipt但收據NUM兩個收據將成爲相同

所以如何使用JPA在mydatabase中實現這一點。我正在使用PostgresSQL。

回答

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; 
    } 

} 
相關問題