java - 防止 hibernate 按列值重复行

标签 java mysql hibernate primary-key unique-constraint

我有一个应用程序,它在 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/

相关文章:

java - Java中如何将线程列表存储到列表中?

mysql - SQL 不同列和 Null

java - @OrderBy 导致java.lang.ClassCastException : antlr. CommonToken cannot be cast to antlr.Token

java - 更新功能像我的添加功能一样工作(Spring,Hibernate,mvc)

java - 如何在 hibernate 中根据 id 更新行

java - JNI 将 TreeMap 从 java 传递到 c

java8 : @NotNull vs Assertion vs Throwing Exception

java - Jess - 有没有一种有效的方法来检查事实是否仍在工作内存中?

java - 2 个表格 1 个网络应用程序 我该怎么办

python - 对 SQL 结果进行排序以提高可读性?