我在几个地方读到,你不能在hibernate中的@ManyToOne上使用级联设置。我正在尝试找到一种方法来做到这一点。让我给你举个例子:
假设我有一个名为Boxer的对象,以及另一个与Boxer关联的名为Fan的对象。我想设置我的类,这样Fan就可以使用@ManyToOne引用Boxer。我不想将它建模为Boxer有一个Fan对象的集合,因为可能有数百万个Fan对象,在运行时它永远不会放在RAM中。
另一方面,如果从数据库中删除了Boxer,我希望我的数据库也删除引用该Boxer的所有Fan行。我知道这可以在数据库中使用层叠设置来完成,但是我找不到一种方法让hibernate使用@ManyToOne来做到这一点。
@Entity
@Table(name="FAN")
public class Fan extends Person {
private Boxer favoriteBoxer;
// hibernate is ignoring all of these cascade settings
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="BOXER_ID",nullable=false)
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
public Boxer getFavoriteBoxer() {
return favoriteBoxer;
}
@Id
@Column(name="FAN_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() {
return super.getId();
}
@Column(name="NAME")
public String getName() {
return super.getName();
}这是拳击手的代码:
@Entity
@Table(name="BOXER")
public class Boxer extends Person {
private int weight;
private int height;
@Column(name="WEIGHT")
public int getWeight() {
return weight;
}
@Column(name="HEIGHT")
public int getHeight() {
return height;
}
@Id
@Column(name="BOXER_ID")
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() {
return super.getId();
}
@Column(name="NAME",unique=true)
public String getName() {
return super.getName();
}下面是hibernate用来创建表的内容:
mysql> show create table BOXER\G
*************************** 1. row ***************************
Table: BOXER
Create Table: CREATE TABLE `BOXER` (
`BOXER_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`HEIGHT` int(11) DEFAULT NULL,
`NAME` varchar(255) DEFAULT NULL,
`WEIGHT` int(11) DEFAULT NULL,
PRIMARY KEY (`BOXER_ID`),
UNIQUE KEY `UK_iwqngmn7h1s95cvtn9twuwybs` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> show create table FAN\G
*************************** 1. row ***************************
Table: FAN
Create Table: CREATE TABLE `FAN` (
`FAN_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) DEFAULT NULL,
`BOXER_ID` bigint(20) NOT NULL,
PRIMARY KEY (`FAN_ID`),
KEY `FK_3oelgvwo3en8m0j1kng75n7w7` (`BOXER_ID`),
CONSTRAINT `FK_3oelgvwo3en8m0j1kng75n7w7` FOREIGN KEY (`BOXER_ID`) REFERENCES `BOXER` (`BOXER_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)如你所见,我想要的是BOXER_ID上的外键有一个级联设置,我不能让hibernate做到这一点,因为我是用@ManyToOne建模的。
有人能告诉我如何让hibernate用@ManyToOne配置级联设置吗?
发布于 2014-05-20 09:10:05
如果其他人感兴趣,我认为最简单的方法是修改schema.sql文件本身。您可以修改create table语句或alter table语句,以便外键也显示为"on delete cascade“。您还需要设置要验证的hbm2ddl.auto,这样hibernate就不会为您更改您的模式。缺点是,您将被迫手动更改数据库模式,但我认为这是值得的。迟早你会意识到hibernate并不是最好的方式,你不应该让hibernate来管理你的模式。
我上过关于hibernate、MySQL和spring的课程;我在我的团队中被认为是hibernate专家,所以听到这个可能会让您感到震惊:我使用hibernate的次数越多,我就越意识到它是多么糟糕和短视。我不断发现它不能做MySQL能做的事情。如果apache gora不能满足我的需求,我实际上正在认真考虑做一个hibernate的替代品。我很确定我可以做得更好。
https://stackoverflow.com/questions/23595352
复制相似问题