【发布时间】:2014-11-24 13:46:39
【问题描述】:
我试图通过将第一个表列(字符串类型)声明为第二个表的外键,以一对一的映射方式连接两个表。
所以这是我主要的两个休眠实体:
主要实体StudyDetails:
@Entity
@Table(name="StudyDetails")
public class StudyDetails {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name="Id")
private Integer id;
@Column(name="InternalID", unique = true, nullable = false)
private String internalId;
@Column(name="StudyInstanceUID", unique = true)
private String studyInstanceUID;
@Column(name="LastUploadedDate")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime lastUploadedDate;
@Column(name="IsProcessed")
private boolean isProcessed;
@Column(name="IsUploaded")
private boolean isUploaded;
第二个DicomSeriesMeta:
@Entity
@Table(name="DicomSeriesMeta")
public class DicomSeriesMeta {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name="Id")
private Integer id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="InternalID", referencedColumnName="InternalID")
private StudyDetails studyDetails;
public StudyDetails getStudyDetails() {
return studyDetails;
}
public void setStudyDetails (StudyDetails studyDetails) {
this.studyDetails = studyDetails;
}
@Column(name="PatientID")
private String patientID;
@Column(name="IssuerOfPatientID")
private String issuerOfPatientID;
@Column(name="PatientSex")
private String patientSex;
@Column(name="PatientName")
private String patientName;
@Column(name="PatientBirthDate")
private String patientBirthDate;
...
}
我想将 StudyDetails.InternalID 作为 DicomSeriesMeta 表的外键...它是使用特定算法生成的 String 类型的唯一 id。
我正在尝试将 DicomSeriesMeta 对象保存在数据库中,例如:
....
DicomSeriesMeta dicomSeriesMeta = new DicomSeriesMeta();
dicomSeriesMeta.setPatientID(patientID);
dicomSeriesMeta.setIssuerOfPatientID(issuerOfPatientID);
dicomSeriesMeta.setPatientSex(patientSex);
dicomSeriesMeta.setPatientName(patientName);
dicomSeriesMeta.setPatientBirthDate(patientBirthDate);
dicomSeriesMeta.setOtherPatientIDs(otherPatientIDs);
....
dicomSeriesMeta.setStudyDetails(getStudyDetailsbyStudyId(studyInstanceUID));
Session s=HibernateUtil.openSession();
s.beginTransaction();
s.save(dicomSeriesMeta);
s.getTransaction().commit();
s.close();
....
但是我得到了:
Hibernate: insert into DicomSeriesMeta (AccessionNumber, InstitutionAddress, InstitutionName, IssuerOfPatientID, MediaStorageSOPInstanceUID, OperatorsName, OtherPatientIDs, OtherPatientIDsSequence, PatientAge, PatientBirthDate, PatientID, PatientName, PatientSex, PhysiciansOfRecord, ReferringPhysicianName, RequestingPhysician, SOPInstanceUID, SeriesInstanceUID, StudyDate, InternalID, StudyID, StudyInstanceUID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Νοε 24, 2014 4:03:16 ΜΜ com.npap.dicomrouter2.FXMLDocumentController startDcmrcvService
SEVERE: null
org.hibernate.exception.GenericJDBCException: could not execute statement
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2975)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3487)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:214)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
at com.npap.utils.ProcessDicomFiles.storeAnonymizationData(ProcessDicomFiles.java:323)
at com.npap.utils.ProcessDicomFiles.anonymizeDicomObj(ProcessDicomFiles.java:233)
at com.npap.utils.AnomynizerFileVisitor.visitFile(AnomynizerFileVisitor.java:24)
at com.npap.utils.AnomynizerFileVisitor.visitFile(AnomynizerFileVisitor.java:15)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at java.nio.file.Files.walkFileTree(Files.java:2742)
at com.npap.utils.ProcessDicomFiles.anonymizeStudyFolders(ProcessDicomFiles.java:55)
at com.npap.dicomrouter2.FXMLDocumentController.startDcmrcvService(FXMLDocumentController.java:219)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1757)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1645)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8216)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3724)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
at com.sun.glass.ui.View.notifyMouse(View.java:925)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/128893786.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: Field 'Id' doesn't have a default value
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
... 90 more
【问题讨论】:
-
也许你应该在插入查询中设置一个 id。
-
应该是哪一列的外键?我猜是InternalId。但是你没有告诉 Hibernate。 docs.oracle.com/javaee/6/api/javax/persistence/…。此外,您应该发布完整的堆栈跟踪和导致引发异常的代码。
-
@JBNizet 我正在尝试将 InternalId 设置为 FK,是的。我已经在 DicomSeriesMeta 表上声明了这一点 (@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name="InternalID")private StudyDetails studyDetails;) ...我还需要在 StudyDetails 上声明它吗?
-
我的问题是“作为 StudyDetails 的 哪一列 的 FK?”。当然,您不希望 varchar DicomSeriesMeta.InternalId 列成为 int StudyDetails.Id 的外键。这就是您当前的映射所做的,因为它没有指定任何目标列名称。
-
@JBNizet 我还想在 DicomSeriesMeta 表中创建一个字段“InternalID”,与表 StudyDetails 中的 FK 同名(StudyDetails.InternalID -FK-> DicomSeriesMeta.InternalID)
标签: java mysql hibernate hibernate-mapping