与@MapsId双向@OneToOne级联

如何解决与@MapsId双向@OneToOne级联

我使用弹簧靴2.1.1.RELEASE,休眠5.3.7.FINAL

规则是,用户不能有电话(phoneuser中可以为空,但是,电话不能在没有用户的情况下存在(user在{{1中不能为空) }}。

实体:

phone

控制器:

@Entity
public class Phone {
    
   @Id
   private Long id;
    
   @OneToOne
   @MapsId
   @JoinColumn(name = "id")
   private User user;
    
   public Long getId() {
       return id;
   }
   public void setId(final Long id) {
       this.id = id;
   }
    
   public User getUser() {
      return user;
   }
   public void setUser(final User user) {
      this.user = user;
   }
}
        
@Entity
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;
    
   @OneToOne(mappedBy = "user",cascade = CascadeType.ALL,orphanRemoval = true)
   private Phone phone;
    
   public Long getId() {
       return id;
   }
   public void setId(final Long id) {
       this.id = id;
   }
    
   public Phone getPhone() {
       return phone;
   }
   public void setPhone(final Phone phone) {
       this.phone = phone;
   }
}

存储库:

@RestController
@RequestMapping
public class UserController {
    
   private final UserService userService;
    
   public UserController(final UserService userService) {
       this.userService = userService;
   }
    
   @GetMapping("/demo")
   public void createUserAndAddPhone() {
       final User user = new User();
       userService.save(user);
       final Phone phone = new Phone();
    
       phone.setUser(user);
       user.setPhone(phone);
       userService.update(user);
   }
}

服务:

public interface UserRepository  extends PagingAndSortingRepository<User,Long> {
}

表格:

@Service
public class UserService {
    
   private final UserRepository userRepository;
    
   public UserService(final UserRepository userRepository) {
       this.userRepository = userRepository;
   }
    
   @Transactional
   public void save(final User user) {
       userRepository.save(user);
   }
    
   @Transactional
   public void update(final User user) {
       userRepository.save(user);
   }
}

应用yml:

CREATE TABLE `phone` (
   `id` bigint(20) NOT NULL,PRIMARY KEY (`id`)
);
    
CREATE TABLE `user` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
)

pom xml:

spring:
   datasource:
      url: jdbc:mysql://localhost:3308/demo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&allowPublicKeyRetrieval=true
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
   jpa:
      database-platform: org.hibernate.dialect.MySQL5Dialect
      hibernate:
         ddl-auto: validate

致电<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 给我一个错误:

org.hibernate.id.IdentifierGenerationException:尝试分配ID 来自空的一对一属性[com.example.demo.Phone.user]

当我注释GET http://localhost:8080/demo时,它可以工作并生成:

userService.save(user);

但是如果insert into `user` values ( ) -- Generated identifier: 13,using strategy: org.hibernate.id.ForeignGenerator insert into `phone` (`id`) values (?) -- Binding parameter [1] as [BIGINT] - [13] 一直存在并随后进行了更新,则它不起作用(引发上述异常)

解决方法

啊,最后,这是一个休眠错误(HHH-12436)。

它可以通过以下用例在纯休眠应用程序中重现:

Session session = sessionFactory.openSession();

Transaction tr1 = session.beginTransaction();
User user = new User();
session.persist(user);
tr1.commit();

Transaction tr2 = session.beginTransaction();
Phone newPhone = new Phone();
user.setPhone(newPhone);
newPhone.setUser(user);
session.merge(user);
tr2.commit();

session.close();

从上面的链接中可以看到,它已在hibernate 5.4分支中修复。

P.S。我能够在最新的5.3版本(5.3.18.Final)中重现该问题

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res