当前位置: 首页 > 知识库问答 >
问题:

Spring/Hibernate/MySQL/JPA实体未保存

慕承允
2023-03-14
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.11.13.RELEASE</version>
    </dependency>
  </dependencies>
DROP TABLE IF EXISTS `property` ;
CREATE TABLE IF NOT EXISTS `property` (
  `id` VARCHAR(60) NOT NULL,
  `supplier_id` VARCHAR(30) NOT NULL,
  `url` VARCHAR(255) NOT NULL,
  `main_pic` VARCHAR(255) NOT NULL,
  `lat` DOUBLE NOT NULL,
  `lng` DOUBLE NOT NULL,
  `sys_type` VARCHAR(30) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `description` TEXT NOT NULL,
  `one_liner` VARCHAR(255) NOT NULL DEFAULT '',
  `num_bedrooms` TINYINT(127) NOT NULL,
  `num_bathrooms` TINYINT(127) NOT NULL,
  `max_occ` TINYINT(127) NOT NULL,
  `country` CHAR(2) NOT NULL,
  `rating` DOUBLE NOT NULL DEFAULT 0,
  `num_raters` INT NOT NULL DEFAULT 0,
  `rank` DOUBLE NOT NULL DEFAULT 0,
  `lowest_ppn` DOUBLE NOT NULL DEFAULT 0,
  `max_ppn` DOUBLE NOT NULL DEFAULT 0,
  `avg_ppn` DOUBLE NOT NULL DEFAULT 0,
  `private_pool` TINYINT(1) NOT NULL DEFAULT 0,
  `pool` TINYINT(1) NOT NULL DEFAULT 0,
  `internet_access` TINYINT(1) NOT NULL DEFAULT 0,
  `air_conditioning` TINYINT(1) NOT NULL DEFAULT 0,
  `bbq` TINYINT(1) NOT NULL DEFAULT 0,
  `satellite` TINYINT(1) NOT NULL DEFAULT 0,
  `hot_tub` TINYINT(1) NOT NULL DEFAULT 0,
  `sauna` TINYINT(1) NOT NULL DEFAULT 0,
  `parking` TINYINT(1) NOT NULL DEFAULT 0,
  `instant_book` TINYINT(1) NOT NULL DEFAULT 0,
  `updated` DATETIME NOT NULL DEFAULT NOW(),
  PRIMARY KEY (`id`, `supplier_id`))
ENGINE = InnoDB;
@Entity
@Table(name="property")
public class Property {

    @EmbeddedId
    private PropertyCompositeKey id;
    @NotNull
    @Column(name="url")
    private String url;
    @Column(name="main_pic")
    @NotNull
    private String mainPic;
    @Column(name="lat")
    @Min(-180)
    @Max(180)
    @NotNull
    private Double lat;
    @Column(name="lng")
    @Min(-90)
    @Max(90)
    @NotNull
    private Double lng;
    @Column(name="type")
    @NotNull
    private String externalType;
    @Column(name="name")
    @NotNull
    private String name;
    @Column(name="description")
    @NotNull
    private String description;
    @Column(name="num_bedrooms")
    @Min(1)
    @NotNull
    private Integer numBedrooms;
    @Column(name="num_bathrooms")
    @Min(1)
    @NotNull
    private Integer numBathrooms;
    @Column(name="max_occ")
    @Min(1)
    @NotNull
    private Integer maxOcc;
    @Column(name="country")
    @Length(min=2,max=2)
    @NotNull
    private String country;
    @Column(name="rating")
    private Double rating;
    @Column(name="num_raters")
    private Integer numRaters;
    @Column(name="rank")
    private Double rank;
    @Column(name="lowest_ppn")
    @Min(1)
    private Double lowestPpn;
    @Column(name="max_ppn")
    @Min(1)
    private Double maxPpn;
    @Column(name="avg_ppn")
    @Min(1)
    private Double avgPpn;
    @Column(name="private_pool")
    private Boolean privatePool;
    @Column(name="pool")
    private Boolean pool;
    @Column(name="internet_access")
    private Boolean internetAccess;
    @Column(name="air_conditioning")
    private Boolean airConditioning;
    @Column(name="bbq")
    private Boolean bbq;
    @Column(name="satellite")
    private Boolean satellite;
    @Column(name="hot_tub")
    private Boolean hotTub;
    @Column(name="sauna")
    private Boolean sauna;
    @Column(name="parking")
    private Boolean parking;
    @Column(name="instant_book")
    private Boolean instantBook;
    @Column(name="updated")
    @Version
    private Timestamp updated;

    public void setKey(String id, String supplierId) {
        PropertyCompositeKey pck = new PropertyCompositeKey();
        pck.setId(id);
        pck.setSupplierId(supplierId);
        this.id = pck;
    }
}
@Embeddable
public class PropertyCompositeKey implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 6575008230123343148L;
    @Column(name="id")
    @NotNull
    private String id;
    @Column(name="supplier_id")
    @NotNull
    private String supplierId;
}
@Repository
public interface PropertyRepository extends JpaRepository<Property, PropertyCompositeKey> {

}
public interface PropertiesService {

    Property save(Property property);
}
@Service
public class PropertyServiceImpl implements PropertiesService {

    @Autowired
    private PropertyRepository repo;

    @Override
    @Transactional
    public Property save(Property property) {
        Property saved =  repo.save(property);
        return saved;
    }

}
@Configuration
@EnableJpaRepositories("property.dao")
@EnableTransactionManagement
@PropertySource(
        value={"classpath:/properties.properties"},
        ignoreResourceNotFound = false)
@ComponentScan(basePackages={"property.properties"})
public class PropertySpringConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
       return new PropertySourcesPlaceholderConfigurer();
    }
    @Bean 
    public DataSource dataSource(@Value("${jdbc.driverClassName}") String driverClass,
            @Value("${jdbc.url}") String url,
            @Value("${jdbc.username}") String un,
            @Value("${jdbc.password}") String pw,
            @Value("${jdbc.minIdleConnections}") int mi,
            @Value("${jdbc.initialPoolSize}") int is) {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driverClass);
        ds.setUrl(url);
        ds.setUsername(un);
        ds.setPassword(pw);
        ds.setMinIdle(mi);
        ds.setInitialSize(is);
        return ds;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan(new String[] { "property.entity" });
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());
        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactory, DataSource ds) {
        JpaTransactionManager jtm = new JpaTransactionManager();
        jtm.setEntityManagerFactory(entityManagerFactory.getNativeEntityManagerFactory());
        jtm.setDataSource(ds);
        return jtm;
    }

    Properties additionalProperties() {
       Properties properties = new Properties();
       properties.setProperty(
         "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
       return properties;
   }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class,classes=PropertySpringConfig.class)
public class TestRepository {

    @Autowired
    private PropertiesService propertyRepository;

    @Test
    @Commit
    public void testRepository() {
        Property p = new Property();
        p.setKey("TEST_ID", "TEST_SUPPLIER");
        p.setAirConditioning(true);
        p.setAvgPpn(500.0);
        p.setCountry("ES");
        p.setDescription("TEST DESCRIPTION");
        p.setExternalType("TEST");
        p.setHotTub(false);
        p.setLat(12.5);
        p.setLng(45.6);
        p.setLowestPpn(150.4);
        p.setMainPic("TEST");
        p.setMaxOcc(5);
        p.setMaxPpn(777.4);
        p.setName("TEST NAME");
        p.setNumBathrooms(3);
        p.setNumBedrooms(7);
        p.setNumRaters(5);
        p.setPrivatePool(true);
        p.setRank(1.0);
        p.setRating(4.5);
        p.setUrl("TEST");
        Property s = propertyRepository.save(p);

    }
}
DEBUG: org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl

我无法看到我错过配置了什么。

你能告诉我,我可以做什么来解决这个问题,并使实体持久化到数据存储吗?

共有1个答案

劳亦
2023-03-14
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf, DataSource ds) {
    JpaTransactionManager jtm = new JpaTransactionManager();
    jtm.setEntityManagerFactory(emf);
    return jtm;
}
 类似资料:
  • 问题内容: 我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@Transactional注释的服务类。它使用包含注入的EntityManager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。 persisten

  • 问题内容: 我正在尝试使用注释将Spring与Hibernate结合使用,并且出现以下错误: 这是我的设置… 我的实体: 我的豆子: } 我在Spring中启用注释: 当我通过BlazeDS从Flex应用程序调用Foo.addBar方法时收到错误消息。 我真的很想避免其他配置,而且似乎所有这些都可以解决。 我正在使用Spring 3.0.0.RC1,Hibernate Annotations 3.

  • 问题内容: 一个运行了几个月的应用程序已经停止使用已经有几个月历史的JPA 批注。在进行集成测试时,我看到许多“ ”类型错误。 我不清楚这里出了什么问题。 我没有文件,因为我正在使用hibernate实体管理器。由于我仅使用注释,因此我的实体没有.hbm.xml文件。我的文件很小,可以正常保存。 我显然丢失了一些东西,但不能动弹。 我正在使用hibernate批注3.2.1,hibernate-e

  • 我有两个实体 实体1 实体2 我对Jpa不是很熟悉,所以如果您需要对我的问题进行任何澄清,或者您需要任何更多的信息,请告诉我。

  • 属性: 这是(Spring): 通过一个REST控制器和一个JSON,我想创建一个新的: 输出JSON: 我希望它们在保存操作之后被验证/返回。 要解决此问题,我必须在REST控制器中注入/声明,并调用方法(或者我必须调用方法以获得完整的持久化实体): 是否有一个自动的方法/注释,使用JPA或Spring或Hibernate,以便拥有“完整的”持久化实体? 我希望避免在每个REST或服务类中声明,

  • 问题内容: 我在父方使用批注具有一对一关系。现在,我想自己保存子实体。 例如,我有和作为孩子的实体,我需要保存(父的id属性设置为之后的课程)。但是,当使用这种安排时,我在下面列出了一个例外… 为什么hibernate不允许这样做的任何想法?更清楚地说,我的代码如下… ParentEntity: ChildEntity: 我尝试保存的方式是… 关于如何尝试保存子实体,任何指针将不胜感激。 问题答案