默认的一对一关系方案为
CREATE TABLE Product (
id INT AUTO_INCREMENT NOT NULL,
shipping_id INT DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Shipping (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Product ADD FOREIGN KEY (shipping_id) REFERENCES Shipping(id);
但我需要使用这个方案,但要做一些修改ON DELETE SET NULL ON UPDATE SET NULL;
:
CREATE TABLE Product (
id INT AUTO_INCREMENT NOT NULL,
shipping_id INT DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Shipping (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Product ADD FOREIGN KEY (shipping_id) REFERENCES Shipping(id) ON DELETE SET NULL ON UPDATE SET NULL;
我可以用学说实体配置创建这个方案吗?
注:I有两个实体:Vendor
和Image
BW'ShopBundle'Entity'Vendor:
type: entity
table: vendors
id:
id:
type: integer
id: true
generator:
strategy: AUTO
oneToOne:
image:
targetEntity: BW'FileBundle'Entity'Image
cascade: [persist, remove]
和
BW'FileBundle'Entity'Image:
type: entity
table: images
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
filename:
type: string
length: 255
nullable: true
我使用oneToOne Unidirectional
关系。
所以当我删除Image
对象时,我有一个错误,因为我有Unidirectional
关系(重要的是要知道我不能将关系更改为bidirectional
)
你试过孤儿移除吗?
来自官方文档:
级联的另一个概念只与从集合中删除实体相关。如果A类型的实体包含对私有实体B的引用,那么如果从A到B的引用被删除,则实体B也应该被删除,因为它不再使用。
OrphanRemoval适用于一对一、一对多和多对多关联
你可以像这样使用orphanRemoval=true
选项:
@OneToOne(targetEntity="Image", orphanRemoval=true)
在删除引用实体时,可以使用onDelete="CASCADE"
强制底层数据库内部删除所有相关对象。
的例子:
@ORM'JoinColumn(name="shipping_id", referencedColumnName="id", onDelete="CASCADE")