사용자 도구

사이트 도구


java:hibernate:id_generator

문서의 이전 판입니다!


Hibernate Primary Key (ID) Generator

hibernate.id.new_generator_mappings

기본 Custom Generator들

Sequence에 대한 변화

  • 기존방식 : SequenceHiLoGenerator ID 생성시 모든 ID마다 Sequence 생성 호출
  • 새 방식 : SequenceStyleGenerator 새로운 Sequence ID 생성방식. 한번 호출로 여러 Sequence를 생성하여 최적화하는 듯. 좀 더 확인 필요.

Table Generator에 대한 변화

Identity (Auto Increment)

@Entity
public class EntityWithIdentityId {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) Long id;
     :
}

Sequence

@Entity
// Define a sequence - might also be in another class:
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100)
public class EntityWithSequenceId {
    // Use the sequence that is defined above:
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
    @Id Long id;
}

Table

@Entity
@TableGenerator(name="tab", initialValue=0, allocationSize=50)
public class EntityWithTableId {
    @GeneratedValue(strategy=GenerationType.TABLE, generator="tab")
    @Id Long id;
}

IdGenerator

  • ID 생성기를 Custom으로 만들 수 있다.
  • IdentifierGenerator를 상속하여 Custom Generator를 만들고
    public class StockCodeGenerator implements IdentifierGenerator {
     
        private static Logger log = Logger.getLogger(StockCodeGenerator.class);
     
        public Serializable generate(SessionImplementor session, Object object)
                throws HibernateException {
     
            String prefix = "M";
            Connection connection = session.connection();
            try {
     
                PreparedStatement ps = connection
                        .prepareStatement("SELECT nextval ('seq_stock_code') as nextval");
     
                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    int id = rs.getInt("nextval");
                    String code = prefix + StringUtils.leftPad("" + id,3, '0');
                    log.debug("Generated Stock Code: " + code);
                    return code;
                }
     
            } catch (SQLException e) {
                log.error(e);
                throw new HibernateException(
                        "Unable to generate Stock Code Sequence");
            }
            return null;
        }
    }
  • 다음과 같은 방식으로 등록해서 사용한다.
    @Id
    @GenericGenerator(name="seq_id", strategy="my.package.StockCodeGenerator")
    @GeneratedValue(generator="seq_id")
    @Column(name = "stock_code", unique = true, nullable = false, length = 20)
    public String getStockCode() {
        return this.stockCode;
    }
  • @GenericGenerator에 파라미터를 지정하는 것도 가능하다. 이를 자신이 만든 Generator에서 받아서 사용한다.
java/hibernate/id_generator.1531285970.txt.gz · 마지막으로 수정됨: 2018/07/11 14:12 저자 kwon37xi