Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to silently truncate strings while storing them when they are longer than the column length definition?

I have a web app, using EclipseLink and MySQL for storing data. Some of these data are strings, ie varchars in the DB. In the code of entities, the strings have attributes like this:

@Column(name = "MODEL", nullable = true, length = 256) private String model; 

The database is not created by eclipseLink from the code, but the length matches the varchar length in the DB. When the length of such a string data is greater than the length attribute, an exception is raised during the call to javax.persistence.EntityTransaction.commit():

javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'MODEL' at row 1 

Then the transaction is rolled back. While I understand that it is the default behaviour, this is not the one I want. I would like the data to be silently truncated, and the transaction to be committed.

Can I do this without adding a call to substring to each and every set method of string data for the concerned entities?

like image 978
Fabien Avatar asked Oct 04 '11 10:10

Fabien


1 Answers

One can truncate a string according to the JPA annotations in the setter for the corresponding field:

public void setX(String x) {     try {         int size = getClass().getDeclaredField("x").getAnnotation(Column.class).length();         int inLength = x.length();         if (inLength>size)         {             x = x.substring(0, size);         }     } catch (NoSuchFieldException ex) {     } catch (SecurityException ex) {     }     this.x = x; } 

The annotation itself should look like:

@Column(name = "x", length=100) private String x; 

(Based on https://stackoverflow.com/a/1946901/16673)

The annotations can be recreated from the database if the database changes, as hinted in the comment to https://stackoverflow.com/a/7648243/16673

like image 197
Suma Avatar answered Oct 01 '22 16:10

Suma