@SQLInsert动态数据库架构

时间:2018-08-31 16:50:10

标签: java hibernate reflection orm

我需要在插入实体时调用存储过程。为此,我正在使用@SQLInsert,它运行良好。我面临的问题是,由于我们使用不同的数据库架构,因此我需要能够在集成测试期间更改部分字符串。

实体(为了节省空间而删除了获取器/设置器):

@Entity
@Table(name = "SNIPPET")
@SQLInsert(sql = "{ call MY_SCHEMA.INSERT_SNIPPET (?, ?, ?, ?, ?, ?) }", callable = true)
public class Snippet extends BaseDomain {

@Lob
@Column(name = "SNIPPET_TEXT_V2", nullable = false)
private String snippetText;

@Column(name = "ORDER", nullable = false)
private int snippetOrder; //1 based.

@Column(name = "NOTES", nullable = true)
private String snippetNotes;

@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
private Status status;

@ManyToOne
@JoinColumn(name = "QUERY_ID")
private Query query;

}

这是我希望能够在运行时/测试启动时更改的行:     @SQLInsert(sql = "{ call MY_SCHEMA.INSERT_SNIPPET (?, ?, ?, ?, ?, ?) }", callable = true)

我需要在运行时使MY_SCHEMA可变/可调。有没有办法通过反射或其他方式做到这一点?

需要注意的几件事-

  • 在我的连接上设置默认架构无效。我们用 USER_SCHEMA连接到数据库并将对象存储在其中 MY_SCHEMA。将默认架构更改为MY_SCHEMA并使用{ call INSERT_SNIPPET (?, ?, ?, ?, ?, ?) }会产生不利影响 在我们应用程序的其他部分。
  • 版本-oracle 11g,java 8,hibernate 5.2

1 个答案:

答案 0 :(得分:0)

找到了解决方案:使用{h-schema}  使用属性spring.jpa.properties.hibernate.default_schema value

示例:

@SQLInsert(check=ResultCheckStyle.NONE, sql = "insert into {h-schema}tabla (campo1, campo2, campo3, campo4, campo5) values (?, ?, ?, ?, ?)")