@PrimaryKeyJoinColumn在Hibernate中与一对一映射无法正常工作

问题描述 投票:3回答:1

在这个tutorial中,作者考虑到了 -

@Entity
@Table
public class Stock implements Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column
    private Integer stockId;

    @Column
    private String stockCode;

    @Column
    private String stockName;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "stock")
    private StockDetail stockDetail;

    // getters and setters
}

@Entity
@Table
public class StockDetail implements java.io.Serializable {


    @Id
    @GeneratedValue(generator = "generator")
    @GenericGenerator(  name = "generator", 
                        strategy = "foreign", 
                        parameters = @Parameter(name = "property", value = "stock"))
    @Column
    private Integer stockId;

    @OneToOne(fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    private Stock stock;
    // getters and setters
}

使用hibernate.cfg.xml文件,该文件具有自动创建表格的条目,如下所示 -

<property name="hbm2ddl.auto">create</property> 

 CREATE TABLE stock
(
  stockid serial NOT NULL,
  stockcode character varying(255),
  stockname character varying(255),
  CONSTRAINT stock_pkey PRIMARY KEY (stockid)
)

CREATE TABLE stockdetail
(
  stockid integer NOT NULL,
  compdesc character varying(255),
  compname character varying(255),
  listeddate date,
  remark character varying(255),
  CONSTRAINT stockdetail_pkey PRIMARY KEY (stockid)
)

您会看到stockdetail表上没有外键约束。为什么?

如果我将@PrimaryKeyJoinColumn更改为@JoinColumn

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn
    private Stock stock;

然后在这种情况下由hibernate生成的表 -

CREATE TABLE stockdetail
(
  stockid integer NOT NULL,
  compdesc character varying(255),
  compname character varying(255),
  listeddate date,
  remark character varying(255),
  stock_stockid integer,
  CONSTRAINT stockdetail_pkey PRIMARY KEY (stockid),
  CONSTRAINT fk9rrwxdqh1fjcoo2usdix4qoiw FOREIGN KEY (stock_stockid)
      REFERENCES stock (stockid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

哪个绝对正确?

请指教?

java hibernate
1个回答
0
投票

用这个更新你的代码。

@OneToOne(fetch = FetchType.LAZY,optional=false)
@PrimaryKeyJoinColumn
private Stock stock;

参考:https://forum.hibernate.org/viewtopic.php?f=9&t=956345

© www.soinside.com 2019 - 2024. All rights reserved.