使用Hibernate

时间:2018-04-01 12:15:50

标签: java oracle hibernate id-generation

我有以下课程。 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?

1 个答案:

答案 0 :(得分: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;
    }
}