0

我有以下课程。StockId类表示Stock类的 Id。股票类代表下表:

CREATE TABLE stock (id NUMBER(10), stock_code VARCHAR2(30), stock_name VARCHAR2(100), CONSTRAINT pk_stock PRIMARY KEY (id));

股票编号类别

@Embeddable
public class StockId implements Serializable {
    private Long id;

    public StockId() {}

    public StockId(Long id) {
       this.id = id;
    }

    @Column(name="id")
    public Long getId() {
       return this.id;
    }

    public void setId(Long id) {
       this.id = id;
    }
}

股票类

@Entity
@Table(name="stock")
public class Stock {
   private StockId stockId;
   private String stockCode;
   private String stockName;

   public Stock() {}

   public Stock(StockId stockId, String stockCode, String stockName) {
      this.stockId = stockId;
      this.stockCode = stockCode;
      this.stockName = stockName;
   }

   @Id
   // Here what should I give ?
   public StockId getStockId() {
        return stockId;
    }

    public void setStockId(StockId stockId) {
        this.stockId = stockId;
    }

    public String getStockCode() {
        return stockCode;
    }

    public void setStockCode(String stockCode) {
        this.stockCode = stockCode;
    }

    public String getStockName() {
        return stockName;
    }

    public void setStockName(String stockName) {
        this.stockName = stockName;
    }
}

我的问题是,如何设计一个休眠生成器来从一个序列中生成一个 StockId ?

4

1 回答 1

0

创建一个客户生成器,如下所示:

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class StockIdGenerator implements IdentifierGenerator {
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object o) throws HibernateException {
        Connection connection = session.connection();

        try {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT stock_sequence.NEXTVAL FROM DUAL");
            if (resultSet.next()) {
                return new StockId(resultSet.getLong(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }
}  

然后在 Stock 类中执行以下操作:

@Entity
@Table(name="stock")
public class Stock {

    @Id
    @Embedded
    @GenericGenerator(name = "stock_id_generator",
            strategy = "name.kaushikam.hibernate.domain.model.StockIdGenerator")
    @GeneratedValue(generator = "stock_id_generator")
   private StockId stockId;
   private String stockCode;
   private String stockName;

   public Stock() {}

   public Stock(StockId stockId, String stockCode, String stockName) {
      this.stockId = stockId;
      this.stockCode = stockCode;
      this.stockName = stockName;
   }

   public StockId getStockId() {
        return stockId;
    }

    public void setStockId(StockId stockId) {
        this.stockId = stockId;
    }

    public String getStockCode() {
        return stockCode;
    }

    public void setStockCode(String stockCode) {
        this.stockCode = stockCode;
    }

    public String getStockName() {
        return stockName;
    }

    public void setStockName(String stockName) {
        this.stockName = stockName;
    }
}
于 2018-04-01T14:08:40.823 回答