Skip to content

PlayEbeanTroubleShooting

npcode edited this page Apr 15, 2013 · 2 revisions

Cannot register class [models.task.TaskBoard] in Ebean server

Bad type on operand stack in method models.task.TaskBoard.getUser()Lorg/codehaus/jackson/JsonNode; at offset 22라는 에러가 원인이 되어 발생했다.

원인: 모델의 property에 대한 getter로 착각될 수 있는 메소드를 만들었다. 위의 getUser() 메소드는 persistent property인 'user'를 얻으려고 의도하여 만든 것이 아니므로, @Transient를 붙여주어야 한다.

간혹 clean-all로 해결되는 경우도 있다.

No ScalarType registered for class models.enumeration.State

data binding을 하려고 하는데, type이 맞는 것이 없는 경우 발생한다.

사례1: 사용자의 query string을 model에 바인딩하려고 하는데, query string의 'state' 필드에 들어있는 값은 State 타입에 대한 것인데, model의 'state' 필드는 타입이 IssueState인 경우 발생했다.

사례2: el.in(sp.getField(), value); value는 Set이고 field의 타입은 Long인 경우임에도 발생했다. No ScalarType registered for class java.util.LinkedHashSet

ManyToMany 관계에서 한쪽을 삭제했을 때 외래키 에러 발생

해결책: 양쪽 모두가 ManyToMany로 상호참조하고 있어야 하며, 둘 중의 한쪽에는 mappedBy 설정도 해주어야 한다.

예:

class Issuelabel extends Model {
    @ManyToMany(mappedBy="labels", fetch = FetchType.EAGER)
    public Set<Issue> issues;
}

class Issue extends Model {
    @ManyToMany(fetch = FetchType.EAGER)
    public Set<IssueLabel> labels;
}

bean 삭제시 존재하지 않는 컬럼을 찾으려다 에러가 발생함

사례: project.delete()로 프로젝트를 삭제하려고 했는데 어째선지 IssueLabel entity에서 issue_id 컬럼을 찾으려 시도했다. IssueLabel과 Issue는 양방향으로 ManyToMany 관계이기 때문에 IsssueLabel에 issue_id 컬럼을 갖고 있지 않아 에러가 발생했다.

[info] Test models.ProjectTest.isOnlyManager ignored
[error] Test models.ProjectTest.delete failed: Query threw SQLException:Column "ISSUE_ID" not found; SQL statement:
[error] select t0.id c0
[error] from issue_label t0
[error] where (issue_id) in (?,?,?,?,?,?,?)  [42122-158]
[error] Bind values:[null]
[error] Query was:
[error] select t0.id c0
[error] from issue_label t0
[error] where (issue_id) in (?,?,?,?,?,?,?)

Issue에서 IssueLabel로의 ManyToMany annotation에서 CascadeType=ALL 을 제거하자 해결되었다.

불필요한 cascading을 삼가야 한다. 예를 들어, 다음의 cascading은 잘못된 것이다.

class Milestone extends Model {
    ...
    @OneToMany(cascade = CascadeType.ALL)
    public Set<Issue> issues;
    ...
}

CascadeType.ALL은 REMOVE를 포함하므로, 마일스톤이 삭제되면 그에 속한 이슈들도 모두 삭제된다. 그러나 실제로 그렇게 동작하는 것을 의도하지는 않았을 것이다. 따라서 cascade를 삭제하거나 REMOVE, ALL 외의 다른 것을 써야 한다.

유사에러 - bean 삭제시 에러 발생

[error] Test models.ProjectTest.delete failed: Query threw SQLException:Parameter "#1" is not set; SQL statement:
[error] select t0.id c0, t0.assignee_id c1 
[error] from issue t0 
[error] where t0.id in (?)  [90012-168] 
[error] Bind values:[] 
[error] Query was:
[error] select t0.id c0, t0.assignee_id c1 
[error] from issue t0 
[error] where t0.id in (?)  
[error] 
[error]     at com.avaje.ebeaninternal.server.query.CQuery.createPersistenceException(CQuery.java:815)
[error]     at com.avaje.ebeaninternal.server.query.CQuery.createPersistenceException(CQuery.java:795)
[error]     at com.avaje.ebeaninternal.server.query.CQueryEngine.findMany(CQueryEngine.java:210)
[error]     at com.avaje.ebeaninternal.server.query.DefaultOrmQueryEngine.findMany(DefaultOrmQueryEngine.java:77)
[error]     at com.avaje.ebeaninternal.server.core.OrmQueryRequest.findList(OrmQueryRequest.java:272)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.findList(DefaultServer.java:1502)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:518)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:563)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.deleteManyDetails(DefaultPersister.java:1176)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.deleteAssocMany(DefaultPersister.java:1143)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:624)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:452)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1867)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1857)
[error]     at com.avaje.ebean.Ebean.delete(Ebean.java:648)
[error]     at models.ProjectTest.delete(ProjectTest.java:71)
[error]     ...
[error] Caused by: org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set; SQL statement:
[error] select t0.id c0, t0.assignee_id c1 
[error] from issue t0 
[error] where t0.id in (?)  [90012-168]
[error]     at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
[error]     at org.h2.message.DbException.get(DbException.java:169)
[error]     at org.h2.message.DbException.get(DbException.java:146)
[error]     at org.h2.expression.Parameter.checkSet(Parameter.java:73)
[error]     at org.h2.command.Prepared.checkParameters(Prepared.java:163)
[error]     at org.h2.command.CommandContainer.query(CommandContainer.java:85)
[error]     at org.h2.command.Command.executeQuery(Command.java:191)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:109)
[error]     at com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:172)
[error]     at com.avaje.ebeaninternal.server.query.CQuery.prepareBindExecuteQuery(CQuery.java:382)
[error]     at com.avaje.ebeaninternal.server.query.CQueryEngine.findMany(CQueryEngine.java:174)
[error]     ... 46 more

ManyToOne 인 field를 null로 설정하기

unittest중에는, 어째서인지 setter를 사용하지 않고서는 ManyToOne인 field를 persistent하게 null로 설정할 수 없다. (optional=true도 아무런 도움이 안됨) 이유는 알 수 없다.

unittest중에는 반드시 getter를 사용해야만 하는 경우도 있다.

assertThat(issue.assignee.user.id).isEqualTo(1l); // Fail. you MUST use getter.
assertThat(issue.assignee.getUser().id).isEqualTo(1l); // Success.

bean 삭제시 왜래키 참조 무결성 에러

OneToMany와 ManyToOne으로 bidirectional 한 관계인 두 entity가 있을 때, One 쪽의 entity가 삭제되면 자동으로 Many쪽의 entity에서 One쪽의 entity에 대한 참조도 사라져야 할 것 같은데 그렇게 되지 않는다. 결국 이로 인해 참조 무결성 에러가 발생한다.

[error] Test models.MilestoneTest.delete failed: ERROR executing DML bindLog[] error[Referential integrity constraint violation: "FK_ISSUE_MILESTONE_10: PUBLIC.ISSUE FOREIGN KEY(MILESTONE_ID) REFERENCES PUBLIC.MILESTONE(ID) (1)"; SQL statement:\n delete from milestone where id=? and title=? and due_date=? and state=? and project_id=? [23503-168]]
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:97)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.delete(DmlBeanPersister.java:48)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeDeleteBean(DefaultPersistExecute.java:109)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:489)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:511)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:635)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:452)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1867)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1857)
[error]     at com.avaje.ebean.Ebean.delete(Ebean.java:648)
[error]     at play.db.ebean.Model.delete(Model.java:167)
[error]     at models.Milestone.delete(Milestone.java:60)
[error]     at models.MilestoneTest.delete(MilestoneTest.java:67)
[error]     ...
[error] Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_ISSUE_MILESTONE_10: PUBLIC.ISSUE FOREIGN KEY(MILESTONE_ID) REFERENCES PUBLIC.MILESTONE(ID) (1)"; SQL statement:
[error] delete from milestone where id=? and title=? and due_date=? and state=? and project_id=? [23503-168]
[error]     at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
[error]     at org.h2.message.DbException.get(DbException.java:169)
[error]     at org.h2.message.DbException.get(DbException.java:146)
[error]     at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:414)
[error]     at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:431)
[error]     at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:307)
[error]     at org.h2.table.Table.fireConstraints(Table.java:871)
[error]     at org.h2.table.Table.fireAfterRow(Table.java:888)
[error]     at org.h2.command.dml.Delete.update(Delete.java:99)
[error]     at org.h2.command.CommandContainer.update(CommandContainer.java:75)
[error]     at org.h2.command.Command.executeUpdate(Command.java:230)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
[error]     at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:203)
[error]     at com.avaje.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:55)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DeleteHandler.execute(DeleteHandler.java:62)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:86)
[error]     ... 45 more

bean 삭제시 왜래키 참조 무결성 에러 2

[error] Test models.ProjectTest.delete failed: ERROR executing DML bindLog[] error[Referential integrity constraint violation: "FK_ASSIGNEE_PROJECT_2: PUBLIC.ASSIGNEE FOREIGN KEY(PROJECT_ID) REFERENCES PUBLIC.PROJECT(ID)"; SQL statement:\n delete from project where id=? and name=? and overview=? and vcs=? and siteurl=? and logo_path is null and owner=? and share_option=? and is_author_editable=? [23503-158]]
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:116)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.delete(DmlBeanPersister.java:67)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeDeleteBean(DefaultPersistExecute.java:128)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:535)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:557)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:654)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:464)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1831)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1821)
[error]     at com.avaje.ebean.Ebean.delete(Ebean.java:678)
[error]     at play.db.ebean.Model.delete(Model.java:142)
[error]     at models.Project.delete(Project.java:70)
[error]     at models.ProjectTest.delete(ProjectTest.java:57)
[error]     ...
[error] Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_ASSIGNEE_PROJECT_2: PUBLIC.ASSIGNEE FOREIGN KEY(PROJECT_ID) REFERENCES PUBLIC.PROJECT(ID)"; SQL statement:
[error] delete from project where id=? and name=? and overview=? and vcs=? and siteurl=? and logo_path is null and owner=? and share_option=? and is_author_editable=? [23503-158]
[error]     at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
[error]     at org.h2.message.DbException.get(DbException.java:169)
[error]     at org.h2.message.DbException.get(DbException.java:146)
[error]     at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:398)
[error]     at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:415)
[error]     at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:291)
[error]     at org.h2.table.Table.fireConstraints(Table.java:861)
[error]     at org.h2.table.Table.fireAfterRow(Table.java:878)
[error]     at org.h2.command.dml.Delete.update(Delete.java:98)
[error]     at org.h2.command.CommandContainer.update(CommandContainer.java:71)
[error]     at org.h2.command.Command.executeUpdate(Command.java:212)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:143)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:129)
[error]     at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:203)
[error]     at com.avaje.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:74)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DeleteHandler.execute(DeleteHandler.java:80)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:105)
[error]     ... 81 more

bean 삭제시의 에러 3

[error] Test models.IssueTest.delete failed: Data has changed. updated [0] rows sql[delete from assignee where id=? and user_id is null and project_id is null] bind[null]
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlHandler.checkRowCount(DmlHandler.java:123)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DeleteHandler.execute(DeleteHandler.java:81)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:105)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.delete(DmlBeanPersister.java:67)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeDeleteBean(DefaultPersistExecute.java:128)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:535)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:557)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:654)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:464)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1831)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1821)
[error]     at com.avaje.ebean.Ebean.delete(Ebean.java:678)
[error]     at play.db.ebean.Model.delete(Model.java:142)
[error]     at models.Assignee.deleteIfEmpty(Assignee.java:76)
[error]     at models.Issue.delete(Issue.java:232)
[error]     at models.IssueTest.delete(IssueTest.java:75)
[error]     ...

getGeneratedSql()이 null을 반환

getGeneratedSql()로 sql 쿼리문을 얻으려면 해당 쿼리가 실행된 상태여야 한다. 즉 findList()와 같은 메소드를 실행해주어야 한다.

    ExpressionList<T> el = makeExpressionList(mop, msp, finder);
    Query<T> q = el.query();
    Page<T> result = q.findPagingList(pageSize).getPage(page);
    q.findList();

    Logger.debug(q.getGeneratedSql());

Can not find Master [class models.NonIssue] in Child[models.Comment]

ManyToMany가 아닌 association이 있을 때는 반드시 양방향으로 참조를 해야 하는 것을 보인다. 이 때 property 이름은 mappedBy와 같거나 그렇게 하지 않으면 BeanPropertyAssocMany.java 의 initChildMasterProperty 메소드에서 마스터를 찾다가 에러를 낸다.

    // find the property in the many that matches
    // back to the master (Order in the OrderDetail bean)
    childMasterProperty = initChildMasterProperty();

unidirectional이 아니라면 master가 꼭 필요하다. mappedBy가 없을 때만 unidirectional인 것 같다.

@OneToMany 의 경우 mappedBy의 default는 ""인데, 이상하게 항상 bidirectional인 것 같다.

ebean이 지원하는 Inheritance 전략은 SINGLE_TABLE 뿐인가?

See http://www.avaje.org/limitation.html

Only Single Table Inheritance

Current there is only support for single table inheritance. The other two inheritance strategies are considered Enhancement requests and will be introduced in a feature release.

그럴거면 다른 전략을 사용하려고 했을 때 exception을 던져야 되는 거 아닌가?

그런데 실제로는 Inheritance annotation 생략시 TABLE_PER_CLASS으로 동작하는 것 같다. Entity 별로 테이블이 하나씩 생겨났다.

entity에 Inheritance를 설정했을 때 DB 에러가 발생한다면 (테이블이 없다라던가)

evolution script가 생성되지 않을 것일 수 있다. db/evolutions/default/*.sql를 삭제해 볼 것.

[error] Test utils.AccessControlTest.isAuthor failed: Database 'default' is in inconsistent state![An evolution has not been applied properly. Please check the problem and resolve it manually before marking it as resolved.]

primary key(id)가 없는 entity가 있는지 확인할 것.

DB가 생기다 말아서 발생하는 문제들.

어떤 테이블은 생기고 어떤 테이블은 안 생긴 상태기 때문에, 종잡을 수 없는 에러들이 발생하게 된다.

만약 DB가 생기다 말았다는 것을 인지하지 못한다면 원인을 찾는데 불필요한 수고를 많이 들이게 될 가능성이 높다.

ebean에서는 transient getter를 지원하지 않는다

@Transient on methods

If you are using Ebean enhancement (Field Access) then you can put the @Transient
annotation on a method and it is NOT intercepted. Specifically the method is left exactly
as it is (rather than having the GETFIELD PUTFIELD byte codes replaced with
intercepted method calls).

2011년에 지원하지 않는다는 글이 메일링 리스트에 올라왔었는데, 지금도 해보면 여전히 안됨. 문서에는 별도로 언급되지 않았음.

https://groups.google.com/forum/?fromgroups=#!searchin/ebean/getter/ebean/TpAmolj9_OU/rGGkIbwhLtwJ

Ebean이 쿼리의 결과를 정렬할 때, DB에 컬럼으로써 존재하지 않는 field를 기준으로 삼을 수 있게 하려면 이게 필요한데 일단 불가능한 것으로 보인다.

parametrised type인 entity가 가능한가

다음과 같은 것이 가능한가?

package models;

import javax.persistence.*;
import play.db.ebean.*;

@Entity
public class Comment<T extends Posting> extends Model {
    @Id
    public Long id;

    @OneToOne
    pubic T container;

    public String body;
};

entity는 만들 수 있지만 container가 null이다. container 라는 필드가 DB에 생기지도 않는다.

어떤 property가 어째선지 계속 null

@Lob 어노테이션이 붙어있다면 반드시 getter로 값을 얻어야 한다.

refresh가 안되는 경우

OneToOne 이외의 relation인 property에는 refresh가 안된다. Ebean.refreshMany를 써서 해결가능.

intellij idea에서 unittest를 실행할 때 에러

javax.persistence.PersistenceException: Error with [models.task.Card] It has not been enhanced but it's superClass [class play.db.ebean.Model] is? (You are not allowed to mix enhancement in a single inheritance hierarchy) marker[play.db.ebean.Model] className[models.task.Card]

@Entity인 클래스가 superclass를 갖고 있다면 발생하는 에러. 아마 enhanced 되어야 할 것 같은 클래스가 subclassing되어있는 것으로 보여서 생기는 문제인듯. play의 경우 모든 entity가 Model을 상속하므로 이런 문제가 발생한다. play run으로 실행할때는 문제없도록 모종의 조치를 취하는 모양이다.

컴파일러 옵션에 javaagent를 ebeanorm으로 설정해준다.

See http://blog.matthieuguillermin.fr/2012/03/unit-testing-tricks-for-play-2-0-and-ebean/

위 링크에 나온 것과 달리 javaagent로 avaje-ebeanorm-agent-3.1.1.jar 를 써도 잘 동작한다.

unittest에서의 ebean의 bytecode enhanced

unittest에서는 ebean의 bytecode enhanced가 잘 동작하지 않는다. intellij idea에서 실행해보면 다음과 같은 에러를 확인할 수 있다.

transform> cls: play/b/bean/odel  msg: ... ignore field _ebean_intercept

_ebean_intercept가 무시되므로 field access시 preSetter가 실행되지 않고, 따라서 field access로 값을 갱신해도 dirty 상태가 되지 않으므로, update()가 제대로 동작하지 않는다. 그러나 save()로 entity를 생성하는 것은 잘 동작한다. (save()로 갱신은 안됨)

이상하게 테스트를 통해 실행된 것이라 할 지라도, entity에 정의한 메소드에서는 preSetter가 동작한다. 이유는 알 수 없다.

unittest에서 play의 setter/getter generation이 동작하지 않을 때

clean-all

deatch?

ebean엔 그런건 없는듯.

– No Attached or Detached Beans

listener

BeanPersistListener 사용방법은 알 수 없다. 문서에 "TODO"라고만 되어있다.

evolution

1.sql을 대체하려고 하는 경우

코드와 DB 스키마의 차이가 발견된 상황에서,

  • 1.sql에 주석으로 매번 대체하라고 되어있음
  • 2.sql이 없다. (불확실)
  • db가 이미 생성되어 있는 경우 (불확실)

nextval

DB migration script를 새로 작성하고 실행하자 이런 에러를 만남.

play.api.UnexpectedException: Unexpected exception[PersistenceException: Error getting sequence nextval]
...
Caused by: javax.persistence.PersistenceException: Error getting sequence nextval
...
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT POSTING_SEQ.NEXTVAL UNION[*] SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL UNION SELECT POSTING_SEQ.NEXTVAL "; expected "identifier"; SQL statement:
select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval union select posting_seq.nextval [42001-168]
    ...

POSTING_SEQ 가 만들어지지 않아서 발생하는 에러로 보인다.

sequence 이름 바꾸기

rename을 지원하지 않으므로, 새로 만들고 이전 것은 지운다.

CREATE SEQUENCE posting_comment_seq START WITH comment_seq.currval;
DROP SEQUENCE IF EXISTS comment_seq;

문법대로라면 START WITH 뒤에는 long이 와야 하는데 어째선지 위의 쿼리도 잘 동작한다.

@NotNull 과 @Column(nullable=false)

전자는 DB의 컬럼에 not null을 설정하지 않는다.

AnswerMe @NotNull 설정되어 있는 필드에 null로 이미 저장되어 있는 값을 DB에서 읽어들이면 어떻게 되는가? @Column(nullable=false)라면?

ManyToMany 관계를 선언했을 때 NullPointerException 발생

양쪽 모두 mappedBy를 설정한 상태였다. 아마도 mappedBy와 관련된 exception이 발생했는데 이를 처리하는 코드에서 NullPointerException이 발생한 듯.

Clone this wiki locally