在Spring Boot应用中使用JPA创建两个相关联的实体
我在开发一个小型应用,并尝试在一个Spring Boot应用中用JPA创建两个相互关联的实体
下面是这两个相互关联的实体 ```java @Entity @Table(name="SUBSCRIPTION") public class Subscription implements Serializable { @Id @GeneratedValue(strategy= GenerationType.AUTO) private Long id;
@ManyToOne()
@JoinColumn(name = "CLIENT_ID", referencedColumnName = "ID", nullable=false)
private UserEntity user;
........
.......
和java
@Entity
@Table(name="USER1")
public class UserEntity implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy="user", cascade = CascadeType.MERGE)
private Set<Subscription> subscriptions;
.....
......
在这个方法中,我尝试用一个数据库中已存在的用户来创建一个订阅,```java
public SubscriptionDto createSubscription(SubscriptionDto subscriptionDto) {
UserEntity user = new UserEntity();
user.setFirstName(subscriptionDto.getUser().getFirstName());
user.setLastName(subscriptionDto.getUser().getLastName());
user = this.userDao.update(user);
Subscription subscription = new Subscription();
subscription.setTypeOfSubscription(subscriptionDto.getTypeOfSubscription());
subscription.setOptionsOfSubscription(subscriptionDto.getOptionsOfSubscription());
subscription.setSubscriptionDate(new Date());
subscription.setUser(user);
subscription = this.subscriptionDao.update(subscription);
``` 与 ```java
public T update( T entity ){
return entityManager.merge( entity );
}
但它提示用户已存在,而我有一个 cascade = CascadeType.MERGE
jakarta.servlet.ServletException: Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "user1_pkey"
Détail : Key (id)=(1) already exists.] [insert into user1 (first_name,last_name,id) values (?,?,?)]; SQL [insert into user1 (first_name,last_name,id) values (?,?,?)]; constraint [user1_pkey]
解决方案
我找到了一个解决方案:为JPA添加persistence.xml,就不再有错误了
<persistence xmlns="https://jakarta.ee/xml/ns/persistence" version="3.0">
<persistence-unit name="persistenceUnitName" transaction-type="JTA">
<properties>
<!-- Database Connection -->
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://localhost/testdb"/>
<property name="jakarta.persistence.jdbc.user" value="postgres"/>
<property name="jakarta.persistence.jdbc.password" value="#######"/>
<!-- Hibernate Provider -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。