鍍金池/ 問答/Java  網(wǎng)絡安全/ JPA+Hibernate:@OneToOne級聯(lián)保存無效

JPA+Hibernate:@OneToOne級聯(lián)保存無效

創(chuàng)建HUSBAND表

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

創(chuàng)建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及構(gòu)造函數(shù)
}
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及構(gòu)造函數(shù)
}
public interface WifeRepository extends JpaRepository<Wife, Integer> {
}

為何Husband實體可以正確添加,但Wife實體卻沒有被級聯(lián)添加呢?

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})
則級聯(lián)新增、修改都可以實現(xiàn),但是我想明確的指定為新增級聯(lián)就是不行

回答
編輯回答
旖襯

建表:

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及構(gòu)造函數(shù)
}
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);

這樣試一下?

另外,這兩個主鍵關(guān)聯(lián)不太合理,采用外鍵關(guān)聯(lián)更合理吧,在wife表設置一個husband_id。一般主鍵id都建議采用自增,主鍵關(guān)聯(lián)不太推薦

還有,數(shù)據(jù)庫字段用大寫怪怪的。。。

2018年9月23日 18:03