首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate @ManyToOne和cascade

Hibernate @ManyToOne和cascade
EN

Stack Overflow用户
提问于 2014-05-12 00:54:14
回答 1查看 517关注 0票数 0

我在几个地方读到,你不能在hibernate中的@ManyToOne上使用级联设置。我正在尝试找到一种方法来做到这一点。让我给你举个例子:

假设我有一个名为Boxer的对象,以及另一个与Boxer关联的名为Fan的对象。我想设置我的类,这样Fan就可以使用@ManyToOne引用Boxer。我不想将它建模为Boxer有一个Fan对象的集合,因为可能有数百万个Fan对象,在运行时它永远不会放在RAM中。

另一方面,如果从数据库中删除了Boxer,我希望我的数据库也删除引用该Boxer的所有Fan行。我知道这可以在数据库中使用层叠设置来完成,但是我找不到一种方法让hibernate使用@ManyToOne来做到这一点。

代码语言:javascript
复制
@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();
    }

这是拳击手的代码:

代码语言:javascript
复制
@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用来创建表的内容:

代码语言:javascript
复制
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配置级联设置吗?

EN

回答 1

Stack Overflow用户

发布于 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的替代品。我很确定我可以做得更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23595352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档