java - 如何配置主键和外键之间的一对一关系?

标签 java hibernate

我有两个表,一个表有 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/

相关文章:

java - 我可以使用 session 作用域 bean 而不是 httpsession 来维护 session 吗

mysql - Hibernate 注释和继承

java - Play + JPA + Hibernate + PostgreSQL : Cannot create Tables

java - 如何将字符串转换为十六进制和将十六进制转换为字符串?

java - 如何在 hibernate 和 postgres 上同步 id?

hibernate - 在 Hibernate 中防止 SQL 注入(inject)

java - 我加载 .txt 文件时做错了什么?

Java - 如何打开位于 jar 文件中的文件

java - RecyclerView 仅在滚动时加载图像

java - JNA - 获取 OSX 上所有可见的窗口句柄