java - Cascade 在 Hibernate 一对一映射中不起作用

标签 java mysql hibernate jpa hibernate-cascade

Person.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="person")
public class Person {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

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

@Column(name="age")
private int age;

@OneToOne(mappedBy="person")
private Passport passport;

----getter and setter----

护照.java

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
public class Passport {

@Id
private String passportNumber;
private Date issuedDate;
private Date expiryDate;
private String issuedPlace;
private String nationality;

@OneToOne
@Cascade(value={CascadeType.DELETE})
@JoinColumn(name="frn_person_id", unique=true, referencedColumnName="id")
private Person person;

---getter setter----

Hibernate 版本:4.2.0.Final
MySQL:5.6.17

以上代码生成如下SQL表:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

CREATE TABLE `passport` (
  `passportNumber` varchar(255) NOT NULL,
  `expiryDate` datetime DEFAULT NULL,
  `issuedDate` datetime DEFAULT NULL,
  `issuedPlace` varchar(255) DEFAULT NULL,
  `nationality` varchar(255) DEFAULT NULL,
  `frn_person_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`passportNumber`),
  KEY `FK4C60F032382EC083` (`frn_person_id`),
  CONSTRAINT `FK4C60F032382EC083` FOREIGN KEY (`frn_person_id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

但是,我想生成如下表:

create table jaydb.person(
    id integer auto_increment primary key,
    name varchar(100) unique,
    age integer
);

create table jaydb.passport(
    passport_number varchar(50) primary key,
    issued_date date,
    expiry_date date,
    issued_place varchar(100),
    nationality varchar(100),
    frn_person_id integer unique,
    foreign key(p_id)
    references jaydb.person(p_id)
    on delete cascade
    on update cascade
);

如您所见,hibernate 生成的表中缺少级联代码。我的要求是在 Person 和 Passport 之间设置一对一映射。如果个人数据被删除,那么它的相关护照也应该被删除。

我也尝试过 javax.persistence 级联,但没有用。

最佳答案

我相信在您的架构中,Person 类是拥有关系,您在该人拥有的护照上拥有 mappedBy 属性就证明了这一点。据我所知,级联注释应该在关系的拥有方。但是,您目前在护照上有它。将您的 Person 类更改为如下所示:

@Entity
@Table(name="person")
public class Person {
    ...

    @OneToOne(mappedBy="person")
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
    private Passport passport;
    ...
}

并从 Passport 类中删除 @Cascade 注释。

关于java - Cascade 在 Hibernate 一对一映射中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39605917/

相关文章:

java - SpringMVC+Hibernate :criteria. list() 返回空

java - mvn eclipse :eclipse does not add src in build path

java - 了解 jpa 锁与事务隔离级别

mysql - php中sql查询的注入(inject)攻击

php - 使用 json 和 cURL 访问禁止的错误 403 Web 服务

mysql - Wildfly 和 mysql 数据库之间的编排

java - JPA Hibernate 和具有用于 map 的 ElementCollection

java - 使用枚举与 boolean 值?

java - 使用一个简单的命令从命令行将一堆 .Java 文件转换为 .Jar 文件

java - 在操作栏上添加 editText