java - 使用 Hibernate 保存对象

标签 java mysql hibernate jpa hibernate-mapping

我有 3 个表 - Rasskazi(主表)、CatsRelations(表 Rasskazi 和表 CatsNames 之间的关系)和 CatsNames。

CREATE TABLE `rasskazi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rasskazName` varchar(777) DEFAULT NULL,
  `rasskazText` text,
  `rasskazDataDobav` datetime DEFAULT NULL,
  `rasskazRazmer` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

CREATE TABLE `catsRelations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rasskazId` int(11) DEFAULT NULL,
  `catId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `rasskazIdFK_idx` (`rasskazId`),
  KEY `catIdFK_idx` (`catId`),
  CONSTRAINT `z1` FOREIGN KEY (`rasskazId`) REFERENCES `rasskazi` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `z2` FOREIGN KEY (`catId`) REFERENCES `catsNames` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `catsNames` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `catName` varchar(777) DEFAULT NULL,
  `oldId` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `oldId_UNIQUE` (`oldId`)
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;

hibernate 对象是:

Rasskazi.hbm.xml [http://pastebin.com/CF4D47M1][1]
Rasskazi.java [http://pastebin.com/29phnEEd][2]
CatsRelations.hbm.xml [http://pastebin.com/MqnXuAQ9][3]
CatsRelations.java [http://pastebin.com/BDqTKqeD][4]
CatsNames.hbm.xml [http://pastebin.com/9YtVkCjD][5]
CatsNames.java [http://pastebin.com/uwpWcLha][6]

所有文件打包到 zip 中,可以下载 here

我尝试通过代码保存对象

Rasskazi r = new Rasskazi();
    r.setRasskazName(storyName);
    Set<CatsRelations> catsRelationses = new HashSet<>();
    Elements katsInfo = doc.select("a[href*=ras.shtml?kat]");
    for (Element kat : katsInfo) {
        String katId = kat.attr("href");
        CatsNames cat = mainBean.getCat(katId); // Here I got CatsNames from my bean, from table named CatsNames

        CatsRelations catsRelations = new CatsRelations();
        catsRelations.setCatsNames(cat);
        catsRelations.setRasskazi(r);

        catsRelationses.add(catsRelations);

    }
    r.setCatsRelationses(catsRelationses);
    r.setRasskazText(textStr);
    Session session = sessionFactory.getCurrentSession();
    session.save(r);

但是 Hibernate 只在名为 rasskazi 的表中保存记录:

Hibernate: 
    insert 
    into
        grabberRasskazov.rasskazi
        (rasskazName, rasskazText, rasskazDataDobav, rasskazRazmer) 
    values
        (?, ?, ?, ?)

并且它不会将任何数据保存到名为 CatsNames 的表中。 为什么它不将数据保存到表 CatsNames 中,为什么它忽略了代码

CatsRelations catsRelations = new CatsRelations();
catsRelations.setCatsNames(cat);
catsRelations.setRasskazi(r);

catsRelationses.add(catsRelations);

}
r.setCatsRelationses(catsRelationses);

?

最佳答案

问题是您没有从父实体级联到子实体:

<set name="children" inverse="true" cascade="all">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>

确保将级联添加到所有一对多关联。

关于java - 使用 Hibernate 保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27747686/

相关文章:

java - 如何将旧文件从 Java Eclipse 工作区复制到新工作区?

使用分区名称与 where 子句的 mysql 查询

java - Hibernate:如何将多个连接表映射到Java对象(用户的书籍列表)

Mysql 表有 2000 万行,统计数据已经过时

mysql - 把自增列定义为主键没有用吗

java - Hibernate/JPA 映射同名的复合主键和外键

hibernate - 如何使用 JPA 和 JpaSpecificationExecutor 按结果分组?

java - 使用 switch 语句处理 fragment 中的 onBackPressed()

java - 使用 OpenCSV 写入 CSV 文件时双引号重复

java - 形成此 if 语句的更好方法?