级联不处于休眠一一对一映射
问题描述:
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。
喜添,你的建议的工作...... 是不是正常的SQL表映射不同。因为我们可以在问题给出的表格定义中看到。我在passport表中添加了级联代码(SQL create query)。 还有一件事,当我导出表模式时,仍然看不到级联代码.... hibernate会在内部处理它吗?因为我认为这是数据库的责任,因为它提供了这些功能。 –
@RaviNain Hibernate [内部处理级联](http://*.com/questions/19185791/delete-where-cascade-delete-in-hibernate)。为什么最初在“Passport”类中放置级联注释的一个原因是因为在MySQL中,您会将此表标记为级联删除。但是在Hibernate中,级联注释发生在所有者身上。 –