2012-01-23 12 views
0

hibernateを使用してクラス食事のオブジェクトをhsql DBに挿入しています。オブジェクトを1個だけ挿入するとうまくいきますが、2番目を挿入しようとするとすぐにエラー。挿入後のHsqlエラー2.オブジェクトが休止状態から

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> 

まずmainメソッドクラスがpersitetする2番目と3番目のクラスのHibernateのマッピングである:ここに私のコードは、エラーがあります。あなたが手動でid財産(<generator class="assigned" />)に値を代入したいのですが、実際にそれを割り当てないことを宣言し

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 

答えて

2

:これはエラーメッセージです。

したがって、値を手動で割り当てるか、別のID生成戦略を宣言する必要があります。