Генерация пользовательских идентификаторов объектов с помощью Hibernate

У меня есть следующие классы. Класс StockId представляет идентификатор класса Stock. Класс акций представляет собой следующую таблицу:

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 из последовательности?


person kaushik    schedule 01.04.2018    source источник


Ответы (1)


Создайте генератор обычаев следующим образом:

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;
    }
}
person kaushik    schedule 01.04.2018