账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    JPA+Hibernate:@OneToOne级联保存无效
    24
    0

    创建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})
    则级联新增、修改都可以实现,但是我想明确的指定为新增级联就是不行

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 蝌蚪小尾巴 普通会员 1楼

      在JPA+Hibernate中,@OneToOne级联保存的异常是MappingException。这是因为Hibernate在尝试保存到数据库之前,需要解析JPA的实体关系图。如果实体关系图中没有找到与某个对象关联的另一个对象,那么Hibernate将抛出这个异常。

      解决这个问题的方法是检查实体关系图中的每个对象,确保它们都存在。如果某个对象没有找到与其关联的另一个对象,那么在尝试保存之前,可以考虑添加一个额外的属性来表示该对象与另一个对象之间的关联关系。

      例如,如果你有两个实体类PersonGroup,并且Person有一个Group属性,那么在实体关系图中,你需要在Person类上添加一个Group属性,如下所示:

      ```java @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

      private String name;
      
      @ManyToOne
      private Group group;
      

      } ```

      然后在Java代码中,你可以这样处理@OneToOne级联保存:

      java @OneToOne(mappedBy = "person") private Group group;

      这样,Hibernate就可以知道group属性与person实体之间的关联关系了。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部