0

I have the following classes. StockId class represents the Id of the Stock class. The stock class represents the following table:

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

Stock Id Class

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

Stock class

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

My question is, How a hibernate generator can be devised to generate a StockId from a sequence ?

kaushik
  • 2,308
  • 6
  • 35
  • 50

1 Answers1

0

Create a custome generator as follows:

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

Then in the Stock class do the following:

@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;
    }
}
kaushik
  • 2,308
  • 6
  • 35
  • 50