我在数据库中有一个表发票,映射到我的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。
答案 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;