2017-03-21 9 views
1

PostgreSQLデータベースによって値がデフォルトとして設定されている複数のパラメータを持つJPA/EclipseLinkモデルがあります。具体的には、私が持っている:新しい行が私のモデルは、このようになりますnow() JPAでINSERTの列をスキップ

デフォルトタイプTIMESTAMP

  • created_at列を追加し、自動インクリメントタイプSERIAL

    • id列を:

      import javax.persistence.*; 
      
      @Entity 
      @Table(name="entity") 
      @NamedQuery(name="Entity.findAll", query="SELECT e from Entity e") 
      public class Entity { 
          @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
          private Integer id; 
      
          @Column(name="created_at") 
          private java.sql.Timestamp createdAt; 
      
          // constructor, getters, and setters 
      } 
      

      の行を挿入しようとするとただし、created_at列の値がNULLに設定されているため、挿入が失敗します。 NULLを挿入するのではなく、単にその列に何も挿入しないで、PostgreSQLでnow()に設定するだけです。基本的にcreatedAt@GeneratedValueを使用したいと思いますが、その注釈は主キーのみであり、複数の属性で使用することはできません。これを達成するために使用できる別のアノテーションがありますか?

  • +0

    おそらくこれがあなたが探しているものです:http://stackoverflow.com/questions/8202154/how-to-create-an-auto-generated-date-timestamp-field-in-a-play-jpa – Spasoje

    答えて

    2

    あなたはColumn注釈でinsertable=falseをしたいことがあります。

    @Column(name="created_at", insertable=false) 
    private java.sql.Timestamp createdAt; 
    

    から:http://docs.oracle.com/javaee/5/api/javax/persistence/Column.html

    はブール挿入可能 は、列が持続によって生成されるSQL INSERT文に含まれているかどうか(オプション)

    を提供
    +0

    正確に私が必要なもの、ありがとう! – Ecliptica

    1

    別の回答で述べたように、JPA prov idersは、insertable = true(デフォルト)としてマークされている場合、insertの値を設定します。これは、文の再利用が可能なため、nullの場合でも多くのプロバイダで発生します。

    エンティティ内(およびキャッシュ内)の値をリフレッシュする必要があるため、ステートメントから除外するだけで済みます。しかし、EclipseLinkには@ReturningInsertがあります。これにより、EclipseLinkはエンティティをデータベース内の値で更新できます。残念ながらサポートはOracleのみです。他のデータベースでは、ストアド・プロシージャを使用して挿入を戻して値を戻す必要があります。

    関連する問題