在这个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
)
哪个绝对正确?
请指教?
用这个更新你的代码。
@OneToOne(fetch = FetchType.LAZY,optional=false)
@PrimaryKeyJoinColumn
private Stock stock;