当前位置: 首页 > 面试题库 >

传递的Spring数据JPA和hibernat独立实体在ManyToMany关系上保持不变

贺恩
2023-03-14
问题内容

我试图保留与已经保留的其他对象具有多对多关系的对象。

这是我的持久化对象(它们已经持久化在数据库中,这是一个MySql):

Product

@Entity
@Table(name="PRODUCT")
public class Product {
    private int productId;
    private String productName;
    private Set<Reservation> reservations = new HashSet<Reservation>(0);

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    public int getProductId() {
        return productId;
    }

    public void setProductId(int productId) {
        this.productId = productId;
    }

@Column(nullable = false)
    public String getProduct() {
        return product;
    }
    public void setProduct(String product) {
        this.product = product;
    }

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "products")
    public Set<Reservation> getReservations() {
        return reservations;
    }
    public void setReservations(Set<Reservation> reservations) {
        this.reservations = reservations;
    }
}

这是我尝试创建的没有持久性的对象

@Entity
@Table(name = "RESERVATION")
public class Reservation {

    private int reservationId;

    private Set<Product> products = new HashSet<Product>(0);

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getReservationId() {
        return reservationId;
    }

    public void setReservationId(int reservationId) {
        this.reservationId = reservationId;
    }

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "product_reservation", joinColumns = { @JoinColumn(name = "reservationId", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "productId", 
            nullable = false, updatable = false) })
    public Set<Product> getProducts() {
        return products;
    }

    public void setProducts(Set<Product> products) {
        this.products = products;
    }
}

这是我的ReservationServiceclass,它接收产品名称数组,使用名称查找产品并将其放入保留对象。

@Service
public class ReservationServiceImpl implements ReservationService {

    @Autowired
    private ProductDAO productDAO;
    @Autowired
    private ReservationDAO reservationDAO;

    @Transactional
    public void createReservation(String[] productNames) {

            Set<Product> products = new HashSet<Product>();
            for (String productName : productNames) {
                Product pi = productDAO.findByProductName(productName);
                products.add(pi);
            }
            Reservation reservation = new Reservation();
            reservation.setProducts(products);
            reservationDAO.save(reservation);   ---> Here I am getting detached entity passed to persist
    }
}

这是我的ProductDAO界面:

public interface ProductDAO extends JpaRepository<Product, Integer> {

    public Product findByProductName(String productName);
}

这是我的spring配置文件:

@Configuration
@PropertySource(value = { "classpath:base.properties" })
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.reservation.dao")
public class RepositoryConfig {

    @Autowired
    private Environment env;

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        EntityManagerFactory factory = entityManagerFactory().getObject();
        return new JpaTransactionManager(factory);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(Boolean.valueOf(env
                .getProperty("hibernate.generate.ddl")));
        vendorAdapter.setShowSql(Boolean.valueOf(env
                .getProperty("hibernate.show_sql")));

        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.hbm2ddl.auto",
                env.getProperty("hibernate.hbm2ddl.auto"));
        jpaProperties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(dataSource());
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.reservation.service.domain");
        factory.setJpaProperties(jpaProperties);
        factory.afterPropertiesSet();
        factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
        return factory;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.username"));
        dataSource.setPassword(env.getProperty("jdbc.password"));
        return dataSource;
    }
}

这是完整的堆栈跟踪:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/web] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.reservation.service.domain.Product; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.reservation.service.domain.Product] with root cause org.hibernate.PersistentObjectException: detached entity passed to persist: com.reservation.service.domain.Product at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)


问题答案:

我有同样的问题,并通过删除来解决cascade = CascadeType.PERSIST

CascadeType.ALL根据文档,你可以使用,它也等同于使用PERSIST:

Defines the set of cascadable operations that are propagated to the associated entity. The value cascade=ALL is equivalent to cascade={PERSIST, MERGE, REMOVE, REFRESH, DETACH}.

这意味着,当你尝试保存预订时,reservationDAO.save(reservation)它还将尝试保留关联的Product对象。但是此对象未附加到此会话。因此发生错误。



 类似资料:
  • 问题内容: 我想保持与ManyToMany关系的实体。但是我在坚持过程中遇到了一些问题。 我的实体: 和 服务代码: 第一次,当我尝试使用UserRoles“ ROLE_USER”保留用户时,没有问题。插入User和UserRoles以及联接表。 我的问题是当我尝试使用相同的UserRoles保留第二个User时。我通过找到它来检查UserRoles是否存在( userRolesServices.

  • 我正在尝试持久化一个与其他已经持久化的对象具有多对多关系的对象。 下面是我的持久化对象(它们已经在db中持久化了,这是一个MySql):- 产品 这是我的no persisted对象,我正在尝试创建它 这是我的类,它接收产品名称的数组,使用该名称查看产品并将其放入reservation对象。 下面是我的接口: 严重:路径为[/web]的上下文中servlet[dispatcher]的servlet

  • 我正在使用Spring、JPA和Hibernate。这是一个玩具示例,我正在使用它来调试一个更大的与JPA相关的问题。但是,这个试图持久化一个非常基本的实体的简单示例似乎创建了分离的对象。据我所知,在对象上调用应该将实体设置为由持久性上下文管理。但是,它不是,而且对此也不起作用。输出如下:: 为简洁起见省略了进口。 :: ::

  • 我刚开始冬眠。我写了一个简单的程序,其中有四个文件。受雇者java它是一个bean类,其中包含getter和setter。 hibernate.cfg.xml 受雇者hbm。xml 存储ata.java 我使用以下sql语句创建了表 但是当我运行这个程序时,我得到以下错误: 组织。冬眠PersistentObjectException:传递给persist的分离实体:hibernate\u prj

  • 我试图存储一个manytomany关系,但它没有存储关系。 下面的代码生成了3个表。 这是我发送到服务器的JSON: {“abbreviatedsequence”:“xdf”,“medals”:[{“name”:“purple”,“id”:1},{“name”:“red”,“id”:2}],“sequence”:“xdfree”,“name”:“savier”} java

  • 我在JPA中定义了两个实体:Employee和Skill。 在这些实体之间定义了relationship@ManyTomany。 现在我有这样的问题:如果我删除技能实体使用实体管理器。它移除OK。但是在@jointable中,在数据库employee_skill中,仍然存在与这个被删除的实体(其id)的关联。 我不想在移除技能时移除员工,所以所有的级联移除或孤立移除在这里都不有用。 我考虑了为什么