我有一个映射到表的简单类。没有什么花哨的,但我有四个没有在类中引用的表列。这是一种典型的模式,它适用于应用程序中的其他任何位置。此外,它一直在工作,直到表中的一个小变化。现在,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 (?, ?, ?, ?, ?, ?, ?, ?, ?)
答案 0 :(得分:1)
现在我不是Hibernate的专家,但我相信这次遇到问题的原因是因为你用@Column
注释了它。
您可以尝试添加@Generated(GenerationTime.insert)
,或将@Column
更改为包含insertable = false, updatable = false
(假设您不希望它也包含在更新中)
答案 1 :(得分:0)
当您使用@Entity
注释某个类时,每个成员都会映射到使用@Transient
注释的除之外的表。请参阅Hibernate documentation。
这意味着您必须使用@Transient
注释不要在插入语句中使用的列。
我喜欢映射文件而不是注释有一些原因; - )