级联不处于休眠一一对一映射

问题描述:

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

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之间的One-to-One映射。如果个人资料被删除,那么它的相关护照也应该被删除。

我试过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 annotatiom。

+0

喜添,你的建议的工作...... 是不是正常的SQL表映射不同。因为我们可以在问题给出的表格定义中看到。我在passport表中添加了级联代码(SQL create query)。 还有一件事,当我导出表模式时,仍然看不到级联代码.... hibernate会在内部处理它吗?因为我认为这是数据库的责任,因为它提供了这些功能。 –

+0

@RaviNain Hibernate [内部处理级联](http://*.com/questions/19185791/delete-where-cascade-delete-in-hibernate)。为什么最初在“Passport”类中放置级联注释的一个原因是因为在MySQL中,您会将此表标记为级联删除。但是在Hibernate中,级联注释发生在所有者身上。 –