JPA+Hibernate:@OneToOne级联保存无效

创建HUSBAND表

CREATE TABLE HUSBAND (
    ID INTEGER,
    NAME VARCHAR2(10) 
);

创建WIFE表

CREATE TABLE WIFE (
    ID INTEGER,
    NAME VARCHAR2(10) 
);

HUABAND实体及Repository

@Entity
@Table(name = "HUSBAND", schema = "SYSTEM")
public class Husband {
    @Id 
    @Column(name = "ID")
    private int id;
    @Column(name = "NAME")
    private String name;
    @OneToOne
    @Cascade({CascadeType.SAVE_UPDATE})
    @PrimaryKeyJoinColumn
    private Wife wife;
    // 省略getter、setter及构造函数
}
public interface HusbandRepository extends JpaRepository<Husband, Integer> {
}

WIFE实体及Repositpry

@Entity
@Table(name = "WIFE", schema = "SYSTEM")
public class Wife {
    @Id 
    @Column(name = "ID")
    private int id;
    @Column(name = "NAME")
    private String name;
    @OneToOne
    @PrimaryKeyJoinColumn
    private Husband husband;
    // 省略getter、setter及构造函数
}
public interface WifeRepository extends JpaRepository<Wife, Integer> {
}

为何Husband实体可以正确添加,但Wife实体却没有被级联添加呢?

Husband husband = new Husband(1, "Tim", new Wife(1, "Lucy"));
husbandRepository.save(husband);

Cascade用的均是Hibernate的类

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

---------------------------分割线-----------------------------

@Cascade({CascadeType.SAVE_UPDATE})
修改为
@Cascade({CascadeType.MERGE})
则级联新增、修改都可以实现,但是我想明确的指定为新增级联就是不行

阅读 6.7k
1 个回答

建表:

CREATE TABLE HUSBAND (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
    `NAME` varchar(128) DEFAULT '默认名称' COMMENT '名称',
     PRIMARY KEY (`ID`) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='丈夫信息'

CREATE TABLE WIFE (
    `ID` bigint(20) NOT NULL COMMENT '赋值ID',
    `NAME` varchar(128) DEFAULT '默认名称' COMMENT '名称',
     PRIMARY KEY (`ID`) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='妻子信息'
@Entity
@Table(name = "WIFE", schema = "SYSTEM")
@GenericGenerator(name = "Wife", strategy = "foreign",
        parameters = {@Parameter(name = "property", value = "husband")})
public class Wife {
    @Id 
    @Column(name = "ID")
    @GeneratedValue(generator = "Wife")
    private int id;
    @Column(name = "NAME")
    private String name;
    @OneToOne(mappedBy = "wife")
    @PrimaryKeyJoinColumn
    private Husband husband;
    // 省略getter、setter及构造函数
}
public class Wife {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    ...
Wife wife = new Wife();
wife.setName("Lucy");
Husband husband = new Husband();
husband.setName("Tim");
husband.setWife(wife);

这样试一下?

另外,这两个主键关联不太合理,采用外键关联更合理吧,在wife表设置一个husband_id。一般主键id都建议采用自增,主键关联不太推荐

还有,数据库字段用大写怪怪的。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题