2011-04-08 133 views
0

我有以下两个表Java的休眠 - 复合主键问题

CREATE TABLE event_type_master( Event_Type_Code VARCHAR(128)NOT NULL, PRIMARY KEY(Event_Type_Code) )

CREATE TABLE event_master( EVENT_CODE PREVARY KEY(Event_Code,Event_Type_Code), CONSTRAINT FK1 FOREIGN KEY(Event_Type_Code)REFERENCES event_type_master(Event_Type_Code)varchar(128)NOT NULL, Event_Type_Code varchar(128)NOT NULL, 0)

现在我对上述关系如下 EventMaster类创建模型类: -

@Entity 
@Table(name="event_master") 
public class EventMaster implements java.io.Serializable { 

private EventMasterId id; 
private EventTypeMaster eventTypeMaster; 
private String eventName; 

public EventMaster() { 
} 

public EventMaster(EventMasterId id, EventTypeMaster eventTypeMaster) { 
    this.id = id; 
    this.eventTypeMaster = eventTypeMaster; 
} 
public EventMaster(EventMasterId id, EventTypeMaster eventTypeMaster) { 
    this.id = id; 
    this.eventTypeMaster = eventTypeMaster; 
    this.eventName = eventName; 
} 

@EmbeddedId  
@AttributeOverrides({ 
@AttributeOverride(name="eventCode", [email protected](name="Event_Code", nullable=false, length=128)), 
@AttributeOverride(name="eventTypeCode", [email protected](name="Event_Type_Code", nullable=false, length=128)) }) 
public EventMasterId getId() { 
    return this.id; 
} 

public void setId(EventMasterId id) { 
    this.id = id; 
} 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="Event_Type_Code",referencedColumnName = "Event_Type_Code", nullable=false, insertable=false, updatable=false) 
public EventTypeMaster getEventTypeMaster() 
{ 
    return this.eventTypeMaster; 
} 

public void setEventTypeMaster(EventTypeMaster eventTypeMaster) { 
    this.eventTypeMaster = eventTypeMaster; 
} 

}

EventMasterId类的复合主键设置: -

@Embeddable 
public class EventMasterId implements java.io.Serializable { 
private String eventCode; 
private String eventTypeCode; 

public EventMasterId() { 
} 

public EventMasterId(String eventCode, String eventTypeCode) 
{ 
    this.eventCode = eventCode; 
    this.eventTypeCode = eventTypeCode; 
} 

@Column(name="Event_Code", nullable=false, length=128) 
public String getEventCode() { 
    return this.eventCode; 
} 

public void setEventCode(String eventCode) { 
    this.eventCode = eventCode; 
} 

@Column(name="Event_Type_Code", nullable=false, length=128) 
public String getEventTypeCode() { 
    return this.eventTypeCode; 
} 

public void setEventTypeCode(String eventTypeCode) { 
    this.eventTypeCode = eventTypeCode; 
} 

public boolean equals(Obje克拉其他){ ........ }

公众诠释的hashCode(){ .......... }
}

EventTypeMaster类

@Entity 
@Table(name="event_type_master") 
public class EventTypeMaster implements java.io.Serializable { 
private String eventTypeCode; 
private String eventTypeName; 
private Set<EventMaster> eventMasters = new HashSet<EventMaster>(0); 

public EventTypeMaster() { 
} 


public EventTypeMaster(String eventTypeCode) { 
    this.eventTypeCode = eventTypeCode; 
} 
public EventTypeMaster(String eventTypeCode, String eventTypeName, Set eventMasters) { 
    this.eventTypeCode = eventTypeCode; 
    this.eventTypeName = eventTypeName; 
    this.eventMasters = eventMasters; 
} 

@Id  
@Column(name="Event_Type_Code", unique=true, nullable=false, length=128) 
public String getEventTypeCode() { 
    return this.eventTypeCode; 
} 

public void setEventTypeCode(String eventTypeCode) { 
    this.eventTypeCode = eventTypeCode; 
} 

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="eventTypeMaster") 
@JoinColumn(name="Event_Type_Code", referencedColumnName = "Event_Type_Code") 
public Set<EventMaster> getEventMasters() { 
    return this.eventMasters; 
} 

public void setEventMasters(Set<EventMaster> eventMasters) { 
    this.eventMasters = eventMasters; 
} 

}

所有设置后,我创建了一个HebernateUtil柯乐s,使用NetBeans中连接到HibernateSession厂,并试图测试记录添加到event_master表如下

Session session = null; 
    session = NewHibernateUtil.getSessionFactory().getCurrentSession(); 

    try { 
     org.hibernate.Transaction tx = session.beginTransaction(); 
     EventMasterId key1=new EventMasterId(); 
     EventTypeMaster eTypeMaster1=new EventTypeMaster(); 

     eTypeMaster1=(EventTypeMaster)session.load(EventTypeMaster.class, "e1"); 

     key1.setEventCode(eTypeMaster1.getEventTypeCode()); 
     key1.setEventCode("Test_Event_Code"); 

     EventMaster em=new EventMaster(); 
     em.setId(key1); 
     em.setEventTypeMaster(eTypeMaster1); 
     em.setEventDesc("Event Description"); 


     session.save(em); 

     session.getTransaction().commit(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

但我得到以下错误

休眠:插入event_master(Create_DTTM,CREATED_BY, Event_Desc,Event_Name,Event_Short_Name,Last_Mod_By,Last_Mod_DTTM,Event_Code,Event_Type_Code)值(?,?,?,?,?,?,?,?,?) 1473 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error :1048,SQLState:23000 1473 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Column' Event_Type_Code”不能为空 1474 [主]错误org.hibernate.event.def.AbstractFlushingEventListener - 无法同步与会话 org.hibernate.exception.ConstraintViolationException数据库状态:无法执行JDBC批处理更新 org.hibernate.exception。 ConstraintViolationException:无法在org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 处执行JDBC批处理更新 at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate。 jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue。的java:167) 在org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 在org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 在org.hibernate作为。 impl.SessionImpl.flush(SessionImpl.java:1028) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) at test.NewMain.main(NewMain.java:46) 引起:java.sql.BatchUpdateException:列'Event_Type_Code'不能为空 at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666) at com .mysql.jdbc.PreparedStatement.executeBatch(PreparedSt atement.java:1082) 在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 在org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)

请帮我解决此问题。

回答

1

我认为你有一个错字。

key1.setEventCode(eTypeMaster1.getEventTypeCode()); 
key1.setEventCode("Test_Event_Code"); 

第一行应该是key1.setEventTypeCode。

+0

谢谢。我找不到这个愚蠢的错误。 – user3678674 2011-04-08 05:01:51

+0

如果有效,请标记答案。 – 2011-04-08 05:13:58