Question

I'm working on a project using spring hibernate & jpa and I'm deploying it on cloud foundry. My problem is that when I call the Dao to persist my entity to the mysql database nothing happens. No errors are thrown, I've tried wrapping the persist in a try catch block and nothing.

I have the show sql property in persistance.xml set to true. When I other Dao methods that just query the database I can see the SQL that gets run. But when I try the persist no SQL gets wrote to the console.

Sample console feedback from a query

Hibernate: select animal0_.animal_id as animal1_1_, animal0_.about as about1_, animal0_.animaltype as animaltype1_, animal0_.breed as breed1_, animal0_.date_in as date5_1_, animal0_.date_out as date6_1_, animal0_.image_1 as image7_1_, animal0_.image_1_content_type as image8_1_, animal0_.image_1_file_name as image9_1_, animal0_.image_1_file_size as image10_1_, animal0_.image_2 as image11_1_, animal0_.image_2_content_type as image12_1_, animal0_.image_2_file_name as image13_1_, animal0_.image_2_file_size as image14_1_, animal0_.image_3 as image15_1_, animal0_.image_3_content_type as image16_1_, animal0_.image_3_file_name as image17_1_, animal0_.image_3_file_size as image18_1_, animal0_.name as name1_, animal0_.status as status1_ from animals animal0_
INFO : com.lasthope.web.animals.service.AnimalsServiceImpl - Found 0 animals in care.

Sample console feedback from the persist:

INFO : com.lasthope.web.animals.service.AnimalsServiceImpl - Saving Gerry to database.
INFO : com.lasthope.web.animals.dao.AnimalsDaoImpl - DAO, saving animal Gerry ID: null

Any feedback would be greatly appreciated!

root-context.xml:

<cloud:data-source id="dataSource" />

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource" />
</bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
    <property name="dataSource" ref="dataSource"/>
</bean> 

Service:

@Service("animalsService")
public class AnimalsServiceImpl implements AnimalsService {

@Autowired
private AnimalsDao animalsDao;


    @Override
@Transactional
public void saveAnimal(Animal animal) {

    logger.info("Saving "+animal.getName()+ " to database.");

    animalsDao.saveAnimal(animal);


}

DAO:

@Repository("animalsDao")
public class AnimalsDaoImpl implements AnimalsDao {

private static final Logger logger = LoggerFactory.getLogger(AnimalsDaoImpl.class);

   private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }

    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

@Override
public void saveAnimal(Animal animal) {

    logger.info("DAO, saving animal " +animal.getName() +" ID: " +animal.getAnimalId());    

    getEntityManager().persist(animal);         

}

persistance.xml

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
        <property name="hibernate.show_sql" value="true"/> 
    </properties>
</persistence-unit>

Animal class:

@Entity
@Table(name="animals")
public class Animal implements Serializable  {

@Id
@Column(name = "ANIMAL_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer animalId;

@Column(name = "ANIMALTYPE")
private String animalType;

@Column(name = "BREED")
private String breed;

@Column(name = "NAME")
private String name;

@Column(name = "IMAGE_1")
@Lob
private Blob image1;

@Column(name = "IMAGE_1_CONTENT_TYPE")
private String image1ContentType;

@Column(name = "IMAGE_1_FILE_NAME")
private String image1FileName;

@Column(name = "IMAGE_1_FILE_SIZE")
private String image1FileSize;

@Column(name = "IMAGE_2")
@Lob
private Blob image2;

@Column(name = "IMAGE_2_CONTENT_TYPE")
private String image2ContentType;

@Column(name = "IMAGE_2_FILE_NAME")
private String image2FileName;

@Column(name = "IMAGE_2_FILE_SIZE")
private String image2FileSize;

@Column(name = "IMAGE_3")
@Lob
private Blob image3;

@Column(name = "IMAGE_3_CONTENT_TYPE")
private String image3ContentType;

@Column(name = "IMAGE_3_FILE_NAME")
private String image3FileName;

@Column(name = "IMAGE_3_FILE_SIZE")
private String image3FileSize;  

@Column(name = "ABOUT")
private String about;

@Column(name = "DATE_IN")
private Date dateIn;

@Column(name = "DATE_OUT")
private Date dateOut;

@Column(name = "STATUS")
private String status;
Was it helpful?

Solution

Got it working! Finally!

Here is a summary of the changes I had to make.

In Animal class (entity object) I changed the id field from a Integer to a long. (I doubt that was anything to do with the fix though!) and removed the implements Serializable.

In the root context I changed the tx from

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>

to

<tx:annotation-driven/>

and I added

<context:component-scan base-package="com.lasthope.web"/>

Then in my servlet context I added

<context:component-scan base-package="com.lasthope.web.controllers" />

It looks like it was a clash between the compenet scans.

Why it worked while pointing to an Oracle database I will never know.

OTHER TIPS

Try setting the GeneratedValue strategy to identity, make sure the ANIMAL_ID column is specified as an autonumber.

@Id
@Column(name = "ANIMAL_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer animalId;

Also, if your using a new version of mySql (v5.x+), in the persistence.xml file you should specify the dialect as:

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />

Try creating a transaction when persisting:

public void saveAnimal(Animal animal) {

    logger.info("DAO, saving animal " +animal.getName() +" ID: " +animal.getAnimalId());    

    EntityManager em = getEntityManager();
    em.getTransaction().begin();
    em.persist(animal);
    em.getTransaction().commit();         

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top