【问题标题】:Preventing hibernate from row duplication by column value防止休眠按列值重复行
【发布时间】:2016-11-01 19:51:39
【问题描述】:

我有一个应用程序,它在 MySQL db 中存储解析的 url 并填充解析的句子,然后使用级联解析 Words 等(所以我只是保存 url,db 自动插入 rest)。

在 ProcessedUrl POJO 我有字段:

Long id
String url
Date date
Set<Sentence> sentences

现在 PK 是 id,它是以本地方式生成的。我想实现这样的目标 - 当用户输入一些已经解析并存储到数据库中的 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>

【问题讨论】:

  • 发布 ProcessedUrl POJO 和当前 hbm xml 文件的完整代码?
  • @javaguy 你来了。

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


【解决方案1】:

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

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

因此,要实现这一点,您需要遵循以下步骤:

(1) 从 App 获取 URL(请勿在此处解析)

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

(3) 如果 URL 不存在,立即解析 URL 并保存到数据库

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多