在Spring Boot应用中使用JPA创建两个相关联的实体

后端开发 2026-07-09

我在开发一个小型应用,并尝试在一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章