我正在尝试让一个实体在 Spring Boot (1.4.4) 应用程序中与 Oracle (11.2) 和 PostgreSQL(9.4) 一起使用。
我的实体包含一个长文本字段(超过 4000 个字符)。Oracle 中适当的数据类型是 CLOB,PostgreSQL 中相应的类型是 TEXT。
我能够让它与 PostgreSQL 一起工作
@Column(name = "LONG_TEXT", columnDefinition="TEXT")
private String longText;
Run Code Online (Sandbox Code Playgroud)
然而,Oracle 在休眠验证阶段会失败,因为 CLOB 需要 @Lob 注释。
以下代码适用于 Oracle
@Lob
@Column(name = "LONG_TEXT")
private String longText;
Run Code Online (Sandbox Code Playgroud)
然而,这次从 PostgreSQL 读取时失败,出现以下异常:
PSQLException:大对象不能在自动提交模式下使用
堆栈溢出建议在事务中执行查询。忽略在选择查询中调用事务的可疑要求,将 @Transactional 添加到查询方法并没有帮助。
任何想法都非常受欢迎。
我正在使用 WildFly 10、Java EE、JPA 和 Hibernate。最近我将我的应用程序从 MySQL 迁移到 PostgreSQL。在使用 MySQL 时,我会使用以下方法将图像存储在我的实体中:
@Lob
@Basic(fetch = FetchType.LAZY)
private byte[] image;
Run Code Online (Sandbox Code Playgroud)
这很好用,MySQL 使用 aLONGBLOB来存储数据。
切换到 PostgreSQL 后,列类型为OID,并且在持久化图像时收到此错误:
Caused by: org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.
at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:308)
at org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:296)
at org.postgresql.jdbc.PgPreparedStatement.createBlob(PgPreparedStatement.java:1202)
at org.postgresql.jdbc.PgPreparedStatement.setBlob(PgPreparedStatement.java:1243)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.setBlob(WrappedPreparedStatement.java:1157)
at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$4$1.doBind(BlobTypeDescriptor.java:112)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:257)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:252)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:39)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2598)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2883)
... 131 more
Run Code Online (Sandbox Code Playgroud)
我以这种方式插入:
@PersistenceContext
EntityManager entityManager;
...
//Simple insert method...
this.entityManager.persist(entity);
Run Code Online (Sandbox Code Playgroud)
这是我的persistence.xml:
<persistence …Run Code Online (Sandbox Code Playgroud) 我正在使用 PostgreSQL 编写带有 Spring-Boot 的服务器,我试图获取有关链接到特定实体的图像的信息。我正在尝试将用户信息从服务器获取到我的前端 Angular 应用程序。在我的系统中,用户有链接到他的帐户的图像,所以我做了 ImageEntity 类
@Entity @Table(name = "image") @Data
public class ImageEntity {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
private String type;
@Lob
private byte[] image;
@JsonIgnore
public byte[] getImage() {
return image;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将图像列表链接到用户帐户类别
@Entity @Data
public class UserAccount{
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String firstName;
private String lastName
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "user_images",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = …Run Code Online (Sandbox Code Playgroud)