繁体   English   中英

JPA 插入外键为 null

[英]JPA inserting foreign key as null

好吧,我已经尝试了所有可以在网上找到的东西,但仍然没有运气。

我有2节课。 趋势图表和趋势。 这是 OneToManyMapping。 TrendsChart 可以有多个趋势。

数据库:SQL 服务器

趋势图表

CREATE TABLE [dbo].[TrendsChart](
    [id] [int] NOT NULL IDENTITY,
    [Name] [varchar] (50) NULL,
PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

趋势表

CREATE TABLE [dbo].[Trends](
    [TrendsID] [int] NOT NULL IDENTITY,
        [ItemName] [varchar] (100) NULL,
    [chart_id] [int] NULL
PRIMARY KEY CLUSTERED
(
    [TrendsID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Trends]  WITH CHECK ADD  CONSTRAINT [FK_Trends_TrendsChart] FOREIGN KEY([chart_id])
REFERENCES [dbo].[TrendsChart] ([id]) ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Trends] CHECK CONSTRAINT [FK_Trends_TrendsChart]
GO

趋势图 Model

@Entity
@Table(name = "TrendsChart")
public class TrendsChart {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="Name")
    private String name;

    @OneToMany(mappedBy="trendsChart", cascade = CascadeType.ALL)
    List<Trends> trends = new ArrayList<>();

趋势 Model

@Entity
@Table(name = "Trends")
public class Trends {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="TrendsID")
    private int trendsID;

    @Column(name="ItemName")
    private String itemName;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name ="chart_id", nullable=false, updatable = false, insertable = true,referencedColumnName = "id")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private TrendsChart trendsChart;

在 controller 我正在做

trendsChartRepository.save(trendsChart);

除了chart_id列始终为 null 之外,所有数据均已正确填充

您必须为 TrandChart 积极设置每个趋势:

@Entity
@Table(name = "TrendsChart")
public class TrendsChart {

   //...

   public void addTrend(Trends trend) {
      this.trends.add(trend);
      trend.setTrendsChart(this);
   }

}

然后保存:

TrendsChart trendsChart = new TrendsChart();
Trends trend = new Trend();
trendsChart.setTrend(trend);
trendsChartRepository.save(trendsChart);

这是关于这个主题的一个很好的教程: https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM