Hibernate插入包括未提及的列

时间:2012-06-01 14:52:27

标签: hibernate

我有一个映射到表的简单类。没有什么花哨的,但我有四个没有在类中引用的表列。这是一种典型的模式,它适用于应用程序中的其他任何位置。此外,它一直在工作,直到表中的一个小变化。现在,Hibernate正在包含类中未引用的四个表列中的一个,导致空约束违规(该列具有默认值;在路上,它将由触发器提供。)

这是表定义(抱歉DDL,SQL Developer不会从网格中“复制”)。除了modifiedby和modifieddate之外,所有列都具有“not 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 (?, ?, ?, ?, ?, ?, ?, ?, ?)

2 个答案:

答案 0 :(得分:1)

现在我不是Hibernate的专家,但我相信这次遇到问题的原因是因为你用@Column注释了它。

您可以尝试添加@Generated(GenerationTime.insert),或将@Column更改为包含insertable = false, updatable = false(假设您不希望它也包含在更新中)

答案 1 :(得分:0)

当您使用@Entity注释某个类时,每个成员都会映射到使用@Transient注释的之外的表。请参阅Hibernate documentation

这意味着您必须使用@Transient注释要在插入语句中使用的列。

我喜欢映射文件而不是注释有一些原因; - )