2016-05-07 10 views
1

に私のコードはPostgresので罰金を実行しているが、私はGreenplumはに切り替えたときに、次の例外が発生する ")(LASTVALサポートされていません":JPAは例外Greenplumは

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: org.postgresql.util.PSQLException: ERROR: lastval() not supported 
Error Code: 0 
Call: select lastval() 
Query: ValueReadQuery(name="SEQ_GEN_IDENTITY" sql="select lastval()") 
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1620) 
    ... 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:874) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.performPreQueryFlush(QueryImpl.java:967) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:207) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:521) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:400) 
    at module.AuthREST.login(AuthREST.java:103) 
    ... 
Caused by: org.postgresql.util.PSQLException: ERROR: lastval() not supported 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1009) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644) 

これは、Userモデルクラスです:

public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id", nullable = false) 
    private Long id; 

    ... 
} 

これはAuthRESTクラスのコードです:

... 

@POST 
@Path("login") 
@Consumes({"application/x-www-form-urlencoded"}) 
public Response login(@Context HttpServletRequest request, 
     @Context HttpServletResponse response, 
     @FormParam("username") String username, 
     @FormParam("password") String password) { 

    request.login(username, password); 
    ... 
} 

...

Greenplumで例外を避けるにはどうすればよいですか?

+0

。 '@ SequenceGenerator'を用いた' GenerationType.SEQUENCE'は実装の詳細に応じて動作するかもしれません。 –

答えて

1

シーケンスがGreenplumはで仕事のやり方:

  • マスターは
  • たびは、セグメントが必要(あなたがプロセスリストに見れば、あなたは別のプロセスを参照してください)「シーケンスサーバ」を実行していますシーケンスの次の値は、それがマスタに接続し、次の値を求めます(ちなみに、これはオーバーヘッドです:http://engineering.pivotal.io/post/SERIAL_Datatype_Performance_in_Greenplum_Database/

下地の問題:シーケンスサーバからの要求にタブを保持しませんセグメントサーバーセグメントごとに最後の値が分かりません。したがって、lastval()には答えられません。

シーケンスサーバーが割り当てられたシーケンス値のログを保持していても、クエリが動作する方法では、lastval()がマスタで実行されますが、実際にはデータは挿入されません。

tl; dr:Greenplumのシーケンスの最後の値を取得するのは問題があります。 lastval()がサポートされていても、返された答えはあなたが探しているものとは異なる可能性があります。

0

sql last_valueカラムを使用してシーケンステーブルを参照してください。独自の最終価値関数を作成することができます。

例:あなたはおそらく、EclipseLinkのためのGreenplumは方言を実装するか、少なくとも新しい `GenerationType`、またはシーケンスの使用を避ける必要があります

Select last_value from wcdl_dictionary.sq_dic_table_definition_table_id 
関連する問題