Persist String variable to Lob with Micronaut Data JDBC - postgresql

I'm using Micronaut Data JDBC and I have an issue.
I have a #MappedEntity for JDBC with a content field that is a String used in a JPA context as follows:
#Lob
#Column(name = "content")
private String content;
I need to migrate this code to JDBC and I need that this content will be persisted as a Lob as well in a PostgreSQL.
With the current code, I'm just able to store the content as a String.
Any idea of how could I achieve that?

For persisting the String content as a LOB, what needs to be done is to annotate the field as follows:
#ColumnTransformer(write = "lo_from_bytea(0, ?::bytea)")
#Column(name = "content")
private String content;
by doing this, PostgreSQL stores an ID in the content column and the data is persisted in the pg_largeobject table as it was desired.

Related

Best practice of handling relations between tables in Spring Data R2dbc

I tried to create a user/roles relation in RDBMS and want to use R2dbc(Spring Data R2dbc) to shake hands with the backend database.
Assume there are three tables, users, roles, and user_roles.
#Table("users")
class User {
#Id
private String username;
private String password;
private String email;
#Builder.Default
private boolean active = true;
#Builder.Default
private List<String> roles = new ArrayList<>();
#Column("created_at")
private LocalDateTime createdDate;
}
Unlike JPA, R2dbc reuses the spring-data-relational-common(which is also used in Spring Data Jdbc) to annotate the tables, but there is no facility to resolve the relations, such as the roles here.
Spring Data R2DBC currently does not support relationships.
So what you would do is to have a separate entity User2Role with two properties: String username and String rolename referencing the ids of the referenced entities.
Since you also tagged the question Spring Data JDBC: Spring Data JDBC does support 1:1 and 1:M references, but not M:1 or M:N relationships. See https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates for some background on that.
Spring Data R2DBC might eventually move to the same model.

Why entities are not updated in postgres

I downloaded empty proj from spring initializr with web,jpa and postgres dependencies.
Added this config in application.properties
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform = org.hibernate.dialect.PostgreSQL94Dialect
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
and created class Test, that's all I have.
#Entity
#Table(name = "tests")
public class Test {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
#Column(length = 200)
private String author;
}
}
And then when the column's length parameter changes nothing happens in the database.
I tried to delete some columns and change some other parameters, result zero "alter table" SQL statements.
Update works only if new column added( update works only on this concrete new column only once).
from how does exactly spring.jpa.hibernate.ddl-auto property works in Spring?
The update operation for example will attempt to add new columns, constraints, etc but will never remove a column or constraint that may have existed previously but no longer does as part of the object model from a prior run.
if you want to change length after table is created, you have to use a Higher-level Database Migration Tool like flyway or liquibase.

Spring Data JPA finder for dynamic fields as Map

My requirement is to have few custom fields in the domain objects. These fields may vary as per the clients.
We are using Spring Data JPA to execute finders. Spring data implicitly provides finders for static fields of the domain and can also handle finders for the fields in the object graph.
I want to know if there is a way to find data on the custom fields? Can someone suggest me a strategy to achieve the same. Below is the sample of my domain class.
public class Employee{
private String name;
private String age;
private Map customeFields; (May vary as per client)
}
I was thinking of overriding QueryLookupStrategy and create my CustomJpaQuery on lines of PartTreeJpaQuery to achieve it. Is there any better approach? Does spring data jpa provides an easy mechanism to override query creation mechanism?
If you are using hibernate (not sure about other JPA implementations) you may add methods with #Query annotations like this:
#Query("select e from Employee as e where e.customeFields[:key] = :value")
List<Employee> findSomeHow(#Param("key") String key, #Param("value") String value)

How to define a big string in Spring Roo annotation(or jpa annotation) entity, varchar(255) is not enough

In spring-roo entity, I define a content field to record the content of the article:
#NotNull
private String content;
But in mysql field, it mapped to varchar(255), it's too short to record a content of article so the following exception thrown:
ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data too long for column 'content' at row 1
My question is what's the big string field type in mysql? (In access db, it's "memo"), how to define this annotation in Spring Roo to make it record more data? Thanks
One option would be to add the Size annotation, e.g.
#NotNull
#Size(max = 500)
private java.lang.String content;
Another option would be to use a LOB field:
#NotNull
#Lob
private byte[] content;
If I need a String field larger than about 255 characters, I usually use a LOB field. However, note that it is generally not possible to search for data inside a LOB field.
Try
#Column(columnDefinition="varchar(255)")

annotation jpa hibernate

in my class request.java I have attribute logo
logo is an image that will record in the mysql database
I am looking for the annotation required attribute logo
I try with
# Lob
private String logo;
Most likely you do not want to persist image with character data type.
For BLOB type in database byte[] is correct Java type:
#Lob
private byte[] logo;