我有两个表,一个表有 id 主键,另一个表键是外键。如何映射这些表之间的一对一关系。请指教。
表1
date_id(PK)
start_date
end_date
create_date
modify_date
表2
product_id(PK)
product_name
productversion
date_id(FK)
在表 1 bean 中配置 OneToOne 关系映射时,
private int date_id;
private ParoducttFeature paroductfeature;
getter / setter
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="DATE_ID")
public int getDate_id() {
return date_id;
}
@OneToOne(fetch = FetchType.LAZY, mappedBy = "daterange", cascade = CascadeType.ALL)
public ProductFeature getParoductfeature() {
return productfeature;
}
public void setProductFeature(ProductFeature productfeature) {
this.productfeature= productfeature;
}
另一个 table-2 bean:
private DateRange daterange;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="date_id")
public DateRange getDaterange() {
return daterange;
}
/**
* @param daterange the daterange to set
*/
public void setDaterange(DateRange daterange) {
this.daterange = daterange;
}
我收到错误,无法插入空值。请告知为什么要插入空值。
错误堆栈跟踪:
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'Date_id', table 'Test.dbo.ProductFeature'; column does not allow nulls. INSERT fails.
com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2989)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3501)
org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:393)
org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:227)
org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:207)
org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:191)
org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321)
org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286)
org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java
hibernate session 代码:
Session session = (Session) HibernateUtil.getSessionFactory().openSession();
dateRange.setStart_date(date1);
dateRange.setEnd_date("12/31/2099");
dateRange.setCreate_date(date1);
dateRange.setModify_date(date1);
session.save(dateRange);
productFeature.setproductname("stack");
productfeature.setproductversion("1.23");
session.save(productFeature);
session.getTransaction().commit();
session.flush();
HibernateUtil.shutdown();
最佳答案
数据库中的 ProductFeature.Date_id
列有非空约束。此列映射到属性 ProductFeature.daterange
。当您在代码中插入 ProductFeature 时,其 daterange
属性为 null。因此,您实际上是将 null 插入到已配置为拒绝 null 值的列中。所以你会得到这个异常。
如果添加
productFeature.setDaterange(dateRange);
在保存productFeature之前,它应该可以正常工作。
关于java - 如何配置主键和外键之间的一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388888/