通过列值

时间:2016-11-01 19:51:39

标签: java mysql hibernate primary-key unique-constraint

我有应用程序,它将解析的URL存储在MySQL数据库中并填充解析的句子,然后使用级联解析单词等(所以我只保存URL,db自动插入休息)。

在ProcessedUrl POJO中我有字段:

Long id
String url
Date date
Set<Sentence> sentences

现在PK是以本机方式生成的id。我希望实现类似的功能 - 当用户输入一些已经解析并存储到db中的url时,它不会被再次/重复解析。

使用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>

1 个答案:

答案 0 :(得分:0)

  

当用户输入一些已经解析并存储到db中的url时,   它不会被再次/重复解析。什么是合适的实现方式   这使用hbm.xml映射?

您无法通过简单的hbm映射执行此操作,因为先前已解析的URL已存储在数据库中,您需要验证数据库中是否已存在最新收到的URL值。

因此,要实现这一目标,您需要按照以下步骤操作:

(1)从App获取URL(不要在此处)

(2)检查数据库中是否存在URL

(3)如果URL不存在,请现在将URL保存并保存到数据库

(4)如果URL已存在,请记录警告/错误或忽略请求