0

テーブルにマップされた単純なクラスがあります。特別なことは何もありませんが、クラスで参照されていない4つのテーブル列があります。これは典型的なパターンであり、アプリケーションの他のすべての場所で機能します。さらに、テーブルが少し変わるまで動作していました。現在、クラスで参照されていない4つのテーブル列の1つがHibernateに含まれているため、null制約違反が発生します(列にはデフォルト値があります。将来的には、トリガーによって提供されます)。

これがテーブル定義です(DDLについては申し訳ありませんが、SQL Developerはグリッドから「コピー」しません)。Modifiedbyとmodifieddateを除いて、すべての列には「nullではない」制約があります。

CREATE TABLE "XYZOWNER"."COMMENTM2" (
"COMMENTID" NUMBER(18,0), 
"CREATEDBY" VARCHAR2(255 CHAR) DEFAULT '{none provided}', 
"CREATEDDATE" DATE DEFAULT sysdate, 
"MODIFIEDBY" VARCHAR2(255 CHAR), 
"MODIFIEDDATE" DATE, 
"CREATEDONDATE" DATE, 
"CREATEDONTIME" DATE, 
"CREATEDBYADMIN" NUMBER(1,0) DEFAULT 0, 
"USERNAME" VARCHAR2(100 CHAR), 
"MKTPARTICIPANTID" NUMBER(18,0), 
"REFAPP" VARCHAR2(20 CHAR), 
"REFID" NUMBER(18,0), 
"TEXT" VARCHAR2(2000 CHAR)
) ;

これがクラスです。

package org.midwestiso.marketapps.mect2.entities;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 * This class implements the Comment entity.
 * <p>
 * Note: the database table is named CommentM2, as "comment" is a reserved word.
 */
@Entity
@Table(name = "mect2owner.commentm2")
public class Comment {
/** DB ID */
private Long commentId;
/** Created on date (midnight GMT) */
private Date createdOnDate;
/** Created on time (1970-01-01 GMT) */
private Date createdOnTime;
/** Created by admin? */
private Boolean createdByAdmin;
/** User name */
private String userName;
/** Market Participant */
private MarketParticipant mktParticipant;
/** Reference application */
private String refApp;
/** Reference application ID */
private Long refId;
/** Text */
private String text;

/**
 * Return the commentId
 * 
 * @return the commentId
 */
@Id
@SequenceGenerator(name = "sequence", sequenceName = "mect2owner.seq_commentm2")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
public Long getCommentId() {
    return commentId;
}

/**
 * Return the createdOnDate <br />
 * Time set to midnight GMT
 * 
 * @return the createdOnDate
 */
public Date getCreatedOnDate() {
    return createdOnDate;
}

/**
 * Return the createdOnTime <br />
 * Date set to 1970-01-01
 * 
 * @return the createdOnTime
 */
public Date getCreatedOnTime() {
    return createdOnTime;
}

/**
 * Return the createdOn date/time as a String
 * 
 * @return the createdOn date/time as a String
 */
@Transient
public String getCreatedOn() {
    final String createdOn;
    final Calendar calendar;

    // Set the calendar to market time (EST)
    calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT-5"));
    // Set the calendar to the created on date + time
    calendar.setTimeInMillis(createdOnDate.getTime() + createdOnTime.getTime());

    createdOn =
            "" + calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH) + "-"
                    + calendar.get(Calendar.DAY_OF_MONTH) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":"
                    + calendar.get(Calendar.MINUTE);

    return createdOn;
}

/**
 * Return the createdByAdmin
 * 
 * @return the createdByAdmin
 */
public Boolean getCreatedByAdmin() {
    return createdByAdmin;
}

/**
 * Return the userName
 * 
 * @return the userName
 */
@Column(name = "createdBy")
public String getUserName() {
    return userName;
}

/**
 * Return the mktParticipant
 * 
 * @return the mktParticipant
 */
@ManyToOne
@JoinColumn(name = "mktParticipantId")
public MarketParticipant getMktParticipant() {
    return mktParticipant;
}

/**
 * Return the refApp
 * 
 * @return the refApp
 */
public String getRefApp() {
    return refApp;
}

/**
 * Return the refId
 * 
 * @return the refId
 */
public Long getRefId() {
    return refId;
}

/**
 * Return the text
 * 
 * @return the text
 */
public String getText() {
    return text;
}

/**
 * Set the commentId (limited scope)
 * 
 * @param commentIdParm
 *           the commentId to set
 */
void setCommentId(final Long commentIdParm) {
    commentId = commentIdParm;
}

/**
 * Set the createdOnDate (limited scope)
 * 
 * @param createdOnDateParm
 *           the createdOnDate to set
 */
void setCreatedOnDate(final Date createdOnDateParm) {
    createdOnDate = createdOnDateParm;
}

/**
 * Set the createdOnTime (limited scope)
 * 
 * @param createdOnTimeParm
 *           the createdOnTime to set
 */
void setCreatedOnTime(final Date createdOnTimeParm) {
    createdOnTime = createdOnTimeParm;
}

/**
 * Set the created on date and time to the current date
 */
public void setCreatedOn() {
    final Date now = new Date();
    final Calendar calendar;

    // Set up a Calendar with GMT timezone and the current date
    calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    calendar.setTime(now);

    // Adjust the Calendar to midnight
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    createdOnDate = calendar.getTime();
    createdOnTime = new Date(now.getTime() - createdOnDate.getTime());
}

/**
 * Set the createdByAdmin
 * 
 * @param createdByAdminParm
 *           the createdByAdmin to set
 */
public void setCreatedByAdmin(final Boolean createdByAdminParm) {
    createdByAdmin = createdByAdminParm;
}

/**
 * Set the userName
 * 
 * @param userNameParm
 *           the userName to set
 */
public void setUserName(final String userNameParm) {
    userName = userNameParm;
}

/**
 * Set the mktParticipant
 * 
 * @param mktParticipantParm
 *           the mktParticipant to set
 */
public void setMktParticipant(final MarketParticipant mktParticipantParm) {
    mktParticipant = mktParticipantParm;
}

/**
 * Set the refApp
 * 
 * @param refAppParm
 *           the refApp to set
 */
public void setRefApp(final String refAppParm) {
    refApp = refAppParm;
}

/**
 * Set the refId
 * 
 * @param refIdParm
 *           the refId to set
 */
public void setRefId(final Long refIdParm) {
    refId = refIdParm;
}

/**
 * Set the text
 * 
 * @param textParm
 *           the text to set
 */
public void setText(final String textParm) {
    text = textParm;
}
}

Hibernateで生成されたSQLは次のとおりです(createdByは問題のある列です)。

insert into xyzowner.commentm2 
(createdByAdmin, createdOnDate, createdOnTime, mktParticipantId, refApp, refId, text, 
createdBy, commentId) 
values (?, ?, ?, ?, ?, ?, ?, ?, ?)
4

2 に答える 2

1

現在、私はHibernateの専門家ではありませんが、今回問題が発生した理由は、に注釈を付けたためだと思います@Column

追加するか、含めるように@Generated(GenerationTime.insert)変更することができます(更新に含めたくない場合)@Columninsertable = false, updatable = false

于 2012-06-01T15:39:15.967 に答える
0

クラスに。で注釈を付けると、。で注釈が付けられたメンバーを除い@Entityて、すべてのメンバーがテーブルにマップされます。Hibernateのドキュメントを参照してください。@Transient

これは、挿入ステートメントに含めたくない@Transient列に。で注釈を付ける必要があることを意味します。

アノテーションではなくマッピングファイルを好む理由がいくつかあります;-)

于 2012-06-01T15:47:37.407 に答える