2013-02-04 39 views
0

我有一个web服务,每天从各种来源获得大约9GB的原始文本数据。绝大多数这是相对较短(100-300)的字符串,经常重复。我可能只有几千个独特的字符串JPA触发器在值已存在时替换插入的ID

我通常不想预先优化,但我们的存储问题很快就会成为开发中的问题。

我有一个JPA实体,并将为此发布而简化。这是一个映射到父表的字符串/ ID对。

@Entity 
public class DeduplicatedString implements Serializable { 


private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 


public int getId() { 
    return id; 
} 




public void setId(int id) { 
    this.id = id; 
} 

private String value; 
public DeduplicatedString() { 
    super(); 
} 
public String getValue() { 
    return value; 
} 
public void setValue(String value) { 
    this.value = value; 
} 

}

我想建立一个JPA监听器(beforeInsert?),以增加新的字符串时,检查现有的数据,并返回现有记录,如果精确匹配已经找到。

我通常只是设置一个插入触发器,我不知道如何在JPA中做到这一点。

谢谢!

回答

1

您需要的功能不是由JPA直接支持的。有一个@PrePersist注释(与several others一起),但这些只能用于例如监视系统,或对实体进行最后的更改。 JPA不知道在数据库中执行的任何触发器,目前还没有链接这两者的机制。

+0

我可以放入一堆任意SQL,当JPA为我创建我的表时,这些SQL会运行吗? – Yablargo

+0

这取决于您使用哪个JPA提供程序?例如,EclipseLink允许您执行此操作:您可以指定您自己的存储过程或自定义SQL查询来执行任何CRUD操作。有关更多详细信息,请参阅此链接:http://wiki.eclipse.org/EclipseLink/Examples/JPA/CRUDStoredProcedures – gcvt

0

你指的是什么意思?你的意思是你不想插入记录?

通常在您的应用程序中执行此操作,您应该首先使用字符串查询对象,并且只有在未找到时才保留新对象。

+0

正确。我想要做到这一点。我知道我可以使用插入触发器或Sproc来查询并返回现有记录,或者如果尚不存在,可以添加一个新记录。我可以使用JPA/JPA听众吗? – Yablargo