Hsql ошибка после вставки 2. объекта через спящий режим - PullRequest
0 голосов
/ 23 января 2012

Я использую hibernate для вставки объектов класса еды в БД hsql. Это нормально работает, если я только вставляю 1 объект, но как только я пытаюсь вставить секунду, это выдает мне ошибку.Вот мой код и ошибка:

 public static void main(String[] args) {
    Main obj = new Main();
    Long mealId1 = obj.saveMeal("Pommes");
    Long mealId2 = obj.saveMeal("Doener1");
}

public Long saveMeal(String mealName)
{

    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null;
    Long mealId = null;
    try {
        transaction = session.beginTransaction();
        Meal meal = new Meal(mealName);
        mealId = (Long) session.save(meal);
        transaction.commit();
    } catch (HibernateException e) {
        transaction.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
    return mealId;
}


package data;
import java.util.List;
import java.util.LinkedList;

public class Meal implements java.io.Serializable {

private long id;
private String name;
private List<Image> images;
private List<Review> reviews;
private Grouping grouping;

public Meal() {
}

public Meal(String mealName) {
    name = mealName;

}

public Meal(long mealId, String mealName) {
    id = mealId;
    name = mealName;
}

public long getId() {
    return id;
}

public void setId(long mealId) {
    id = mealId;
}

public String getMealName() {
    return name;
}

public void setMealName(String mealName) {
    name = mealName;
}

public float getAvg() {
    float avg = 0;
    for (int i = 0; i < reviews.size(); i++)
    {
        avg = avg + reviews.get(i).getReviewPoints();
    }
    return avg;
}

public List<Image> getNumberImages(int number) {
    assert (number >= 0);
    return  images.subList(0, number) ;
}

public List<Image> getImages() {
    return images;
}

public void setImages(LinkedList<Image> images) {
    this.images = images;
}



public List<Review> getReviews(int number) {
    assert (number >= 0);
    return  reviews.subList(0, number) ;
}



public LinkedList<String> getAltNames() {
    LinkedList<String> altNames = new LinkedList<String>();
    LinkedList<Meal> altNameMeals = grouping.getMeals();
    for (int i = 0; i < altNameMeals.size(); i++)
    {
        altNames.add(altNameMeals.get(i).getMealName());
    }
    return altNames;
}

public void addReview(Review review) {
    if (!reviews.contains(review)) {
        reviews.add(review);
    }
}

public Grouping getGrouping() {
    return grouping;
}

public void setGrouping(Grouping grouping) {
    this.grouping = grouping;
}


public void addImage(Image image) {
    if (!images.contains(image)) {
        images.add(image);
    }
}<hibernate-mapping>
<class name="data.Meal" table="MEAL">
    <id name="id" type="long" access="field">
        <column name="ID" />
        <generator class="assigned" />
    </id>
    <property name="name" type="java.lang.String" access="field">
        <column name="NAME" />
    </property>


    <list name="images" inverse="false" table="IMAGE" lazy="true" access="field">
        <key>
            <column name="ID" />
        </key>
        <list-index column="column_name" />
        <one-to-many class="data.Image" />
    </list>
    <list name="reviews" inverse="false" table="REVIEW" lazy="true" access="field">
        <key>
            <column name="ID" />
        </key>
        <list-index></list-index>
        <one-to-many class="data.Review" />
    </list>


    <many-to-one name="grouping" class="data.Grouping" fetch="join">
        <column name="GROUPING" />
    </many-to-one>

</class>

Первый - это основной метод, 2-й класс - перситет, и 3-й - отображение спящего режима для класса.Это сообщение об ошибке:

843 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: -104, SQLState: 23505  
843 [main] ERROR org.hibernate.util.JDBCExceptionReporter - integrity constraint violation: unique constraint or index violation; SYS_PK_10585 table: MEAL  
843 [main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session

1 Ответ

2 голосов
/ 23 января 2012

Вы заявили, что хотите назначить значения свойству id вручную (<generator class="assigned" />), но на самом деле его не присваиваете.

Итак, вам нужно присвоить значение вручную или объявить другой идентификаторстратегия генерации.

...