を使用して、1 対多の親子関係を持つ親エンティティを削除しようとしていentityManager.remove(parent)
ます。ただし、SQL ログから、OpenJPA がUPDATE
最初に呼び出して、フィールドに null を設定しようとしていることがわかりNOT NULL
ます。
executing prepstmnt 773394836 UPDATE child SET parent_id = ? WHERE parent_id = ? [params=(null) null, (long) 16]
executing prepstmnt 1127292223 DELETE FROM parent WHERE id = ? [params=(long) 16]
executing prepstmnt 1297966852 DELETE FROM child WHERE lookup_id = ? AND parent_id = ? [params=(int) 1, (long) 16]
UPDATE
この最初の呼び出しを防ぐためにクラスを構成するにはどうすればよいですか?
私のクラス:
@Entity
@Table(name = "parent")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER,
orphanRemoval = true)
@JoinColumn(name = "parent_id")
private List<Child> children;
// getters, etc.
}
@Entity
@Table(name = "child")
@IdClass(ChildPrimaryKey.class)
public class Child {
@Id
@Column(name = "parent_id", nullable = false, updatable = false)
private long parentId;
@Id
@Column(name = "lookup_id")
private int lookupId;
@ManyToOne
@JoinColumn(name = "parent_id", referencedColumnName = "id",
nullable = false, insertable = false, updatable = false)
private Parent parent;
// getters, etc.
}
私のDBテーブル(MySQL内):
CREATE TABLE IF NOT EXISTS `parent` (
`id` BIGINT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `child` (
`lookup_id` INT NOT NULL ,
`parent_id` BIGINT NOT NULL ,
PRIMARY KEY (`parent_id`, `lookup_id`) ,
INDEX `fk_library_code_idx` (`parent_id` ASC) ,
CONSTRAINT `fk_library_code`
FOREIGN KEY (`parent_id` )
REFERENCES `parent` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;