2016-04-30 61 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; 
    } 

}