2017-11-24 10 views
0

H2 데이터베이스에서 실행중인 응용 프로그램이 있고 Hibernate가 ORM 도구입니다. 현재,이 응용 프로그램을 H2 데이터베이스 대신 mysql 데이터베이스를 사용하도록 변경하고 있으며이 작업을 수행하는 동안 flagjp 항목을 저장할 때이 문제가 발생했습니다.(Hibernate, mysql) 원인 : java.sql.SQLException : 'id'필드에 기본값이 없습니다.

다음은이 문제를 일으킨 FlagJP 항목입니다. 여기

@Entity 
public class FlagJP extends BaseModelJP { 

    @Id 
    @GeneratedValue(generator = "IdOrGenerated") 
    @GenericGenerator(name = "IdOrGenerated", strategy = "com.jp.menu.api.model.JPSequenceGenerator") 
    private Long flagId; 

    private String flagKey; 

    @OneToMany(mappedBy="flag", cascade = CascadeType.ALL) 
    private List<FlagLangJP> flagLangs = new ArrayList<>(); 

    @ManyToOne 
    private FlagCategoryJP flagCategory; 

@Entity 
public class FlagLangJP extends BaseModelJP { 

    @Id 
    @GeneratedValue(generator = "IdOrGenerated") 
    @GenericGenerator(name = "IdOrGenerated", strategy = "com.jp.menu.api.model.JPSequenceGenerator") 
    private Long id; 

    private String languageCode; 

    private String flagName; 

    private String flagDescription; 

    @ManyToOne 
    private FlagJP flag; 

셋째 엔티티

@Entity 
public class FlagCategoryJP extends BaseModelJP { 

    @Id 
    @GeneratedValue(generator = "IdOrGenerated") 
    @GenericGenerator(name = "IdOrGenerated", strategy = "com.jp.menu.api.model.JPSequenceGenerator") 
    private Long flagCategoryId; 

    private String flagCategoryName; 

    @OneToMany(mappedBy = "flagCategory") 
    private List<FlagJP> flags; 

이 문제를 조사하는 동안 FlagJP

두 번째 개체에 대한 관련 엔티티, 나는 알아낼 수 있었다 최대 절전 모드 생성시 데이터베이스에 자동 증가가 설정되지 않은 FlagJP 테이블 스키마가 원인입니다. DDL. 그때 MySQL은이 오류가 발생, 수동으로 SQL 쿼리를 실행하여 자동 증가를 설정하려고하면

여기 FlagJP

enter image description here

의 DDL이다.

Operation failed: There was an error while applying the SQL script to the database. 
ERROR 1833: Cannot change column 'flagId': used in a foreign key constraint 'FK_sk95esyf1n0gt1qqmlmdmq0uw' of table 'butterfly_emenu.flaglangbpa' 
SQL Statement: 

제 질문은 H2 데이터베이스를 사용할 때이 문제가 발생하지 않습니다. 데이터베이스가 MySQL 일 때 최대 절전 모드를 사용하여이 문제를 해결하는 방법. 어떤 조언에 미리

감사

업데이트 : 여기

는 MySQL의에서 내가

public class JPSequenceGenerator extends IdentityGenerator { 

    private static final Logger logger = LoggerFactory.getLogger(JPSequenceGenerator.class); 

    @Override 
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException { 
     Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session); 

     if (id == null) { 
      id = super.generate(session, object); 

     } 



     return id; 
    } 

} 
+0

이 순서는 ID가 null을 생성하거나 테이블에 제대로 저장하지 않을 때 발생합니다. –

답변

0

가 AUTO_INCREMENT 필드 ID와 코드 아래에보십시오 사용하고 시퀀스 생성기 코드입니다

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long flagId; 

fl에 대해 auto_increment을 (를) 추가 할 수없는 경우 그런 다음 foreignKey를 제거한 후 FK_sk95esyf1n0gt1qqmlmdmq0uw을 입력 한 다음 auto_increment를 추가하고 외래 키를 다시 추가하십시오.

+0

답변 해 주셔서 감사합니다. 변경 사항을 제안했지만 문제는 여전히 존재합니다. FK를 제거하고 테이블을 변경하는 것에 대한 귀하의 의견과 관련하여이 방법이 마음에 들지 않습니다. 최대 절전 모드 엔티티를 기반으로 DDL을 생성하고 데이터베이스를 수동으로 변경하지 않고 DDL을 작동시켜야합니다. 이 경우에 최대 절전 모드를 만드는 방법 – KItis

+0

@KItis Entity 클래스에서이'@GeneratedValue (strategy = GenerationType.AUTO)'를 지정하고 hibernate를 통해 DDL을 생성한다. 동일한 오류가 발생합니까? 시도 했습니까? –

+0

예, 동일한 시도했습니다. – KItis