簡體   English   中英

Java Hibernate-復合主鍵問題

[英]Java Hibernate - Composite Primary Key Issue

我有以下兩個表

創建表event_type_master(Event_Type_Code varchar(128)NOT NULL,PRIMARY KEY(Event_Type_Code))

創建表event_master(Event_Code varchar(128)NOT NULL,Event_Type_Code varchar(128)NOT NULL,PRIMARY KEY(Event_Code,Event_Type_Code),CONSTRAINT FK1 FOREIGN KEY(Event_Type_Code)參考Event_type_master(Event_Type_Code))

現在,我為上述關系創建了模型類,如下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", column=@Column(name="Event_Code", nullable=false, length=128) ), 
@AttributeOverride(name="eventTypeCode", column=@Column(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(Object other){........}

public int 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;
}

}

設置全部之后,我使用Netbeans創建了一個HebernateUtil類以連接到HibernateSession Factory,並嘗試測試將記錄添加到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錯誤:1048,SQLState:23000 1473 [main]錯誤org.hibernate.util.JDBCExceptionReporter-列“ Event_Type_Code”不能為空1474 [main]錯誤org.hibernate.event.def.AbstractFlushingEventListener-無法與會話org.hibernate.exception.ConstraintViolationException同步數據庫狀態:無法執行JDBC批更新org.hibernate.exception.ConstraintViolationException:無法在org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java: 94)位於org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)位於org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)位於org.hibernate.engine.ActionQueue.executeActions(ActionQueue.ja va:266)在org.hibernate.event.def.DefaultFlushEventListener上的org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)上的org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)的.onFlush(DefaultFlushEventListener.java:50)org.hibernate.transaction的org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)的.onFlush(DefaultFlushEventListener.java:50) JDBCTransaction.commit(JDBCTransaction.java:137)在測試中.NewMain.main(NewMain.java:46)由以下原因引起:java.sql.BatchUpdateException:com.mysql.jdbc.PreparedStatement.executeBatchSerially()上的列“ Event_Type_Code”不能為null在com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082)在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)在org.hibernate.jdbc.AbstractBatcher.execute處的PreparedStatement.java:1666) (AbstractBatcher.java:268)

請幫我解決這個問題。

我想你有錯字。

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

第一行應該是key1.setEventTypeCode。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM