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



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----

Passport.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----

休眠版本:4.2.0.最终版本
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注释性。

相关内容

  • 没有找到相关文章

最新更新