@Entity @Table(name="CHAOS") @SQLInsert( sql="INSERT INTO CHAOS(size, name, nickname, id) VALUES(?,upper(?),?,?)") @SQLUpdate( sql="UPDATE CHAOS SET size = ?, name = upper(?), nickname = ? WHERE id = ?") @SQLDelete( sql="DELETE CHAOS WHERE id = ?") @SQLDeleteAll( sql="DELETE CHAOS") @Loader(namedQuery = "chaos") @NamedNativeQuery(name="chaos", query="select id, size, name, lower( nickname ) as nickname from CHAOS where id= ?", resultClass = Chaos.class) public class Chaos { @Id private Long id; private Long size; private String name; private String nickname;
@Loader
: @SQLInsert
,, @SQLUpdate
, @SQLDelete
, @SQLDeleteAll
org.hibernate.persister.entity
Log Level을 DEBUG
로 지정하고 보면 하이버네이트가 생성한 SQL과 파라미터 순서를 볼 수 있는데, 이와 똑 같은 순서로 SQL 파라미터를 지정해야 한다.@Entity @SecondaryTables({ @SecondaryTable(name = "`Cat nbr1`"), @SecondaryTable(name = "Cat2"}) @org.hibernate.annotations.Tables( { @Table(appliesTo = "Cat", comment = "My cat table" ), @Table(appliesTo = "Cat2", foreignKey = @ForeignKey(name="FK_CAT2_CAT"), fetch = FetchMode.SELECT, sqlInsert=@SQLInsert(sql="insert into Cat2(storyPart2, id) values(upper(?), ?)") ) } ) public class Cat implements Serializable {
@OneToMany @JoinColumn(name="chaos_fk") @SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?") @SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?") private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();
@JoinColumn(foreinKey=@ForeinKey…)
표준이 생겨서 더이상 이 애노테이션은 불필요하다.@org.hibernate.annotations.ForeignKey(name=“fk_parent_id_child”)
: 객체간의 연관을 맺을 때 FK 인덱스의 이름을 명시해준다.FK숫자여러개지정
으로 된다.@org.hibernate.annotations.ForeignKey(name=“none”)
: name=“none”은 FK를 강제로 못 맺게 한다. Forcing hbm2ddl to not generate an FK@ColumnTransformer
, Class에 지정할 때는 @ColumnTransformers
로 다중지정 가능.@Column @ColumnTransformer(read = “pgp_sym_decrypt(creditCardNumber, ‘mySecretKey’)”, write = “pgp_sym_encrypt(?, ‘mySecretKey’)”) private String creditCardNumber;
insert
구문 생성시 null 값에 대해서는 생성하지 않는다.update
구문 생성시 변경된 것에 대해서만 생성한다.@Immutable
에 update를 날리면 오류 없이 그냥 무시하고 넘어간다. 오류가 발생하게 하려면 설정이 필요하다.@Immutable
엔티티는 여전히 JPQL이나 Criteria로 업데이트 가능하다. 단, 5.2.17부터는 업데이트를 막았으나 WARNING만 남긴다. 여기에 오류까지 발생시키려면 아래 프라퍼티를 설정한다. hibernate.query.immutable_entity_update_query_handling_mode=exception