0

休止状態を使用して Postgres データベースに接続しています。データベースにはテーブルがあり、そのテーブルにレコードが挿入されたときに現在の時刻を格納するように列の 1 つが設定されています。Postgres インターフェイスからレコードを挿入すると、現在の時刻が自動的に入力されます。

しかし、Hibernate からレコードを挿入しようとすると、データベースによって現在の時刻列にレコードが自動的に挿入されません。

Query dateQuery=session.createQuery("select b.boilerPlateContent from Boiler_Plates b join b.bt_contracts c where c.contractId=:val order by b.boilerPlateContent desc)").setEntity("val",ct);
Iterator dateIterator = dateQuery.list().iterator();
String latestBoilerPlate=(String)dateIterator.next();
System.out.println(latestBoilerPlate);
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher(latestBoilerPlate);
while(m.find()){
 lastEntered=m.group();
 nextBoilerPlateNumber=Integer.parseInt(m.group());
}
nextBoilerPlateNumber++;
Boiler_Plates  bp=new Boiler_Plates();
bp.setBoiler_plate_id(boilerPlateId);
boilerPlateText="bp"+nextBoilerPlateNumber;
bp.setBoilerPlateContent(boilerPlateText);
bp.setBoilerPlateName("Test");
//bp.setInsertTime();
bp.setContract(ct);
session.save(bp);
tx.commit(); 
4

2 に答える 2

2

あなたは監査を行おうとしているようです。これには、独自のソリューションを作成するのではなく、使用する必要のある非常に確立されたソリューションがあります。enversPostgreSQL wikiのトリガー例、および@ PrePersist、@ PreUpdate、およびエンティティリスナーによるJPA監査サポートを参照してください。さらに良いことに、@ Embeddableエンティティと@EntityListenerを使用して、監査コードを再利用できるようにします。

列が自動的に設定される方法を指定していません。

DEFAULTを設定した場合、HibernateはINSERTのすべての列に値を指定するため、DEFAULTは使用されません。列の設定を回避するか、キーワードを列値として明示的に指定するには、Hibernateを取得する必要がありますDEFAULT。これは、insertable = false、updatable=falseとしてマッピングすることで実行できます。または、Hibernateに必要な値を直接挿入させる必要があります。

もう1つのオプションは、ON INSERT FOR EACH ROWトリガーを使用して列の値を設定することです。これにより、INSERT時に誰かが列に何を指定しても、PL/PgSQLから値を設定できます。

別のエンティティリスナーの例を次に示します。

于 2012-05-23T01:46:46.500 に答える
0

すでに指摘したように、最初の質問の情報はかなり不足しています。ただし、「レコードを挿入すると現在の時刻が自動的に入力される」というのは、その列に DEFAULT が定義されていることを意味していると仮定すると、DEFAULT 値は、挿入ステートメントでその列が参照されていない場合にのみ有効になります。デフォルトでは、Hibernate は挿入ステートメントのすべての列を参照します。ただし、その動作は変更できます。ここで、私が思うこのマッピングのようなものを探しています:

@Entity
public class Boiler_Plates {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    @Generated(GenerationTime.INSERT) 
    @Column(insertable = false)
    Date insertTime
}

@Column(insertable = false) は、この列を INSERT ステートメントに含めないように指示します。@Generated(GenerationTime.INSERT) は、生成された値を見つけるために INSERT が実行された後にその列の状態を再読み取りするように指示します。

于 2012-05-23T12:23:34.063 に答える