我有一个应用程序,它在 MySQL 数据库中存储解析后的网址并填充解析后的句子,然后使用级联解析单词等(所以我只保存网址,数据库自动插入其余部分)。
在 ProcessedUrl POJO 中我有字段:
Long id
String url
Date date
Set<Sentence> sentences
目前 PK 是以 native 方式生成的 id。我想实现类似的目标 - 当用户输入一些已经解析并存储到数据库中的网址时,它不会被再次解析/重复。
使用 hbm.xml
映射实现此目的的合适方法是什么?
编辑:
ProcessedUrl POJO:
public class ProcessedUrl {
private long id;
private String url;
private Date date;
private Set<Sentence> sentences;
public ProcessedUrl() {
}
public ProcessedUrl(String url, Date date) {
this.setUrl(url);
this.setDate(date);
}
public ProcessedUrl(String url, Date date, Set<Sentence> sentences) {
this.setUrl(url);
this.setDate(date);
this.setSentences(sentences);
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Set<Sentence> getSentences() {
return this.sentences;
}
public void setSentences(Set<Sentence> sentences) {
this.sentences = sentences;
}
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof ProcessedUrl)) return false;
ProcessedUrl that = (ProcessedUrl) obj;
EqualsBuilder eb = new EqualsBuilder();
eb.append(this.getUrl(), that.getUrl());
return eb.isEquals();
}
@Override
public int hashCode() {
HashCodeBuilder hcb = new HashCodeBuilder();
hcb.append(url);
return hcb.toHashCode();
}
}
ProcessedUrl.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="model">
<class name="ProcessedUrl">
<id name="id">
<column name="url_id" />
<generator class="native"/>
</id>
<property name="url" type="text"/>
<property name="date" type="java.util.Date" />
<set name="sentences" cascade="all" >
<key column="PROCESSED_URL_ID" />
<one-to-many class="model.Sentence" />
</set>
</class>
</hibernate-mapping>
最佳答案
When user enters some url, which is already parsed and stored into db, it won't be parsed again/duplicated. What is suitable way of achieving this using hbm.xml mapping ?
您无法使用简单的 hbm 映射来执行此操作,因为之前解析的 URL 已存储在数据库中,并且您需要验证最新接收到的 URL 值是否已存在于数据库中。
因此,要实现这一目标,您需要执行以下步骤:
(1) 从应用程序获取 URL(请勿在此处解析)
(2) 检查数据库中是否已存在该URL
(3) 如果 URL 不存在,则立即解析 URL 并保存到数据库
(4) 如果 URL 已存在,则记录警告/错误或忽略请求
关于java - 防止 hibernate 按列值重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40367598/