Unikanie zapisywania duplikatów w Hibernate

0

Witam. Zaczynam zabawę z Hibernate i mam pytanie odnośnie zapisu danych. Załóżmy, że mamy już w tabeli adres: ul. XYZ Warszawa 88-888. Użytkownik wprowadza adresy, no i w pola tekstowe w jakimś GUI wprowadził dokładnie takie dane, więc nowy obiekt będzie przechowywał te same informacje co obiekt już zapisany tyle że nie będzie miał ID.
Pytanie brzmi jak wykryć to, że w bazie już jest obiekt z takimi danymi, żeby nie zapisać tego nowego obiektu z taki samym zestawem danych?

0
@Column(unique = true)

?

0

Stosuje mapowanie XML. Wpisałem to tak i nic, dalej mogę wprowadzić ten sam zestaw danych.

 <property name="postCode" type="java.lang.String">
            <column name="POSTCODE" unique="true"/>
        </property>
0

Nic się nie zmieniło. Może to dla tego że korzystam z SQLite. Czy jest jakiś inny (w miarę "elegancki") sposób? Do projektu mam też dołączony Hibernate Search, można by wyszukać pasujące obiekty (przez zwykłe zapytanie lub H. Search), ale to raczej mało wydajny sposób?

I jeszcze jedno pytanie, żeby nie zakładać nowego wątku, jaki DBMS mogę wykorzystać bez opłat licencyjnych w komercyjnej aplikacji?

0
  1. Wydaje mi się ze nawet w SQLite powinno to działać. A jakie "create table" generuje ci sie po uruchomieniu aplikacji?
  2. MySQL, PosgreSQL, OracleExpress
0

Mam włączoną opcję wyświetlania SQL ale w konsoli nie dostaję nic oprócz standardowych logów z uruchamiania.
W pliku konfiguracyjnym:

 
  <property name="show_sql">true</property>
  <property name="format_sql">true</property>
  <property name="use_sql_comments">true</property>

Sprawdziłem SQLite obsługuje unique więc nie wiem czemu to nie śmiga.

0

A widzisz zwykłe zapytania jak są wykonywane z aplikacji? Może po prostu nie masz ustawionego tworzenia tabeli przy starcie aplikacji i tego unique nie bierze ci pod uwage bo tabele już istnieją?

0

Tak, polecenia SQL przy transakcjach widzę, ale samego tworzenia tabel nie.
W konfiguracyjnym mam:

 <property name="hbm2ddl.auto">update</property>

Więc tabele powinny się chyba tworzyć. Przed każdym uruchomieniem usuwam plik bazy, i folder z indexami lucena.

0

A daj na chwilę create-drop zamiast tego.

0

Uuu, działa :)
To jest przy tworzniu tabel

Hibernate: 
    create table ADDRESS (
        ID bigint not null,
        CITY varchar(255),
        STREET varchar(255),
        POSTCODE varchar(255),
        primary key (ID)
    )

A w tym to nawet nie wiem o co chodzi. Czyżby o to, że SQLite ma problem z alter table?

ERROR: near "constraint": syntax error
Hibernate: 
    alter table ADDRESS 
        add constraint UK_erlvpkob32yexdl6gx74n3jqc  unique (POSTCODE)
sie 10, 2014 9:18:48 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: HHH000389: Unsuccessful: alter table ADDRESS add constraint UK_erlvpkob32yexdl6gx74n3jqc  unique (POSTCODE)
0

A masz dobrą składnie ustawioną w konfiguracji?

0

To znaczy?

0

Pokaż cały ten swój konfig.

0
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
  <property name="hibernate.connection.driver_class">org.sqlite.JDBC</property>
  <property name="hibernate.connection.url">jdbc:sqlite:address.db</property>
  <property name="hibernate.dialect">db.dialect.SQLiteDialect</property>
  <property name="hbm2ddl.auto">create-drop</property>
  <property name="hibernate.current_session_context_class">thread</property>
  <property name="hibernate.search.default.directory_provider">filesystem</property>
  <property name="hibernate.search.default.indexBase">lucene\indexes</property>
  <property name="show_sql">true</property>
  <property name="format_sql">true</property>
  <property name="use_sql_comments">true</property>
  
  <mapping class="db.model.Address"
   package="db.model" resource="db/model/Address.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

I klasa adresu

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="db.model.Address" table="ADDRESS" >
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="city" type="java.lang.String" >
            <column name="CITY" unique="true" />
        </property>
        <property name="street" type="java.lang.String">
            <column name="STREET" unique="true"/>
        </property>
        <property name="postCode" type="java.lang.String">
            <column name="POSTCODE" unique="true" />
        </property>
    </class>
</hibernate-mapping>

0

To niestety ja nie widzę gdzie leży problem. Możesz od biedy spróbować podmienić bazę na inną, np. hsql

0

Dzięki za pomoc, spróbuję jakoś obejść ten problem zapytaniem do bazy w tle albo faktycznie zmienię bazę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1