2017-01-15 10 views
1

Ich versuche, zugeordnetes Objekt PostgreSQL-Datenbank mit korrekter ID einzufügen. Dies ist, wie ich einfügen:Hibernate nicht mit definierter Sequenz (postgresql)

Session session = Main.getSession(); 
Transaction rx = session.beginTransaction(); 
ProductsEntity productsEntity = new ProductsEntity(); 
productsEntity.setName(nameTextField.getText()); 
productsEntity.setDescription(descriptionTextArea.getText()); 
productsEntity.setCategory((ProductCategoriesEntity) categoryComboBox.getSelectedItem()); 
productsEntity.setPrice(new BigDecimal(1.0)); 
session.save(productsEntity); 
tx.commit(); 
session.close(); 

Klasse mit definierten Reihenfolge:

@Entity 
@Table(name = "products", schema = "public", catalog = "shop") 
public class ProductsEntity { 
    private int id; 
    private String name; 
    private String description; 
    private BigDecimal price; 

    @Id 
    @Column(name = "id", nullable = false) 
    @SequenceGenerator(name="pk_sequence",sequenceName="products_id_seq") 
    @GeneratedValue(strategy=GenerationType.AUTO,generator="pk_sequence") 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Basic 
    @Column(name = "name", nullable = false, length = -1) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Basic 
    @Column(name = "description", nullable = false, length = -1) 
    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Basic 
    @Column(name = "price", nullable = false, precision = 2) 
    public BigDecimal getPrice() { 
     return price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     ProductsEntity that = (ProductsEntity) o; 

     if (id != that.id) return false; 
     if (name != null ? !name.equals(that.name) : that.name != null) return false; 
     if (description != null ? !description.equals(that.description) : that.description != null) return false; 
     if (price != null ? !price.equals(that.price) : that.price != null) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = id; 
     result = 31 * result + (name != null ? name.hashCode() : 0); 
     result = 31 * result + (description != null ? description.hashCode() : 0); 
     result = 31 * result + (price != null ? price.hashCode() : 0); 
     return result; 
    } 

    private ProductCategoriesEntity category; 

    @ManyToOne 
    public ProductCategoriesEntity getCategory() { 
     return category; 
    } 

    public void setCategory(ProductCategoriesEntity category) { 
     this.category = category; 
    } 
} 

Letzter Wert von products_id_seq postgresql Sequenz 4. Hibernate ist = 0 mit der ID-Objekt einfügen, so erste Einsatz war erfolgreich, jetzt Ich erhalte eine eindeutige Constraint-Verletzung.

EDIT Ich habe Sequenz Arbeit gemacht durch den Generator Zugabe

<generator class="identity"/> 

in XML-Mapping-Definition

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="entities.ProductsEntity" table="products" schema="public" catalog="shop"> 
     <id name="id"> 
      <column name="id" sql-type="integer"/> 
      <generator class="identity"/> 
     </id> 
     <property name="name"> 
      <column name="name" sql-type="varchar"/> 
     </property> 
     <property name="description"> 
      <column name="description" sql-type="varchar"/> 
     </property> 
     <property name="price"> 
      <column name="price" sql-type="numeric(9,2)" precision="9" scale="2"/> 
     </property> 
     <many-to-one name="category" column="category_id" class="entities.ProductCategoriesEntity" lazy="false"/> 
    </class> 
</hibernate-mapping> 

Dies funktioniert ohne Folge in der Klasse definiert wird. Ich habe auch versucht,

@GeneratedValue(strategy=GenerationType.IDENTITY) 

in der Klassendatei zu verwenden, aber es funktioniert nicht.

Wenn jemand eine Idee hat, sag mir bitte, warum nur die "xml" -Methode funktioniert.

+0

Generieren Sie die Tabelle mit Hibernate oder manuell über eine Konsole? Das macht einen Unterschied für die Annotation "SequenceGenerator". – coladict

+0

@coladict Tabelle mit Sequenz wird manuell erstellt und Klasse mit XML wird von Inteliij IDE generiert – dawidmt

+0

Bei Verwendung von '@ SequenceGenerator' muss' allocationSize' mit dem Inkrementwert Ihrer Sequenz übereinstimmen. Der Standardwert 'allocationSize' ist 50, die Standardschrittweite ist 1, so dass es versucht, doppelte IDs einzufügen. Wenn die Spalte jedoch ihren Standardwert aus der Sequenz verwendet, gibt es keinen Grund dafür, dass @GeneratedValue (strategie = GenerationType.IDENTITY) nicht funktioniert. – coladict

Antwort

0

Ist die Sequenz "products_id_seq" eine DB-Sequenz?

Wenn ja, dann ändern Sie Ihre GenerationType von Auto zu SEQUENCE.
Ich habe eine ähnliche Einstellung mit Postgres und Einstellung GenerationType als SEQUENCE und geben allocationSize = 1 für mich gearbeitet.

Stellen Sie außerdem sicher, dass Ihre Sequenz mit der Tabelle übereinstimmt. Wenn nicht, ändern Sie die Reihenfolge für den Moment, damit Ihre weiteren Updates nicht fehlschlagen.

Verwandte Themen