2016-10-04 4 views
-4

私は2つのテーブルAとBを持っています。テーブルBは既にデータを持っています。テーブルAにデータを挿入したくありません。 テーブルAの1行はテーブルBの多くの行に対応し、テーブルBの1行はテーブルAの多くの行に対応します。 また、データをリレーショナルテーブルA_Bに挿入します。 これをどのように達成できますか?hibernateのmany-to-manyマッピングでただ1つのテーブルに挿入

+2

Javaコード** may ** work –

+0

もちろんJavaコードは動作する必要があります。 – Rohit

+1

あなたが試したこと、多分私たちが助けてくれることをお見せしてください –

答えて

0
ここ

は私ParcelTrackingクラスです:

private int tracking_ID; 
private Date update_DateTime; 
private Set<TrackingStatus> trackingStatus; 
private String comments; 
// getter,setter and constructor 

TrackingStatusクラス:

private int trackingStatus_ID; 
private String trackingStatus_Desc; 
private String comments; 
private ParcelTracking parcelTracking; 
//Getter, setter and constructor 

parceltracking.hbm.xml:

<class name = "org.trackmodel.ParcelTracking" table = "parceltracking"> 
    <id name = "tracking_ID" column = "Tracking_ID"> 
    </id> 
    <property name = "update_DateTime" column = "Update_DateTime"></property> 
    <property name = "comments" column = "Comments"></property> 
    <set name = "trackingStatus" table = "parcel_status" cascade = "none" > 
    <key column = "Tracking_ID"></key> 
    <many-to-many class = "org.trackmodel.TrackingStatus" column = "TrackingStatus_ID"></many-to-many> 
    </set> 
</class> 

trackingstatus.hbm.xml:

<class name = "org.trackmodel.TrackingStatus" table = "trackingstatus"> 
    <id name = "trackingStatus_ID" column = "TrackingStatus_ID"> 
    </id> 
    <property name = "trackingStatus_Desc" column = "TrackingStatus_Desc"></property> 
    <property name = "comments" column = "Comments"></property> 
    <join table = "parcel_status" inverse = "true"> 
     <key column = "TrackingStatus_ID"></key> 
     <many-to-one name = "parcelTracking" class = "org.trackmodel.ParcelTracking" column = "Tracking_ID"/> 
    </join> 
</class> 

ここで私のようにRandomCodeジェネレータクラスを使用してTRACKING_IDを生成します。

private static final int MAX = 99999999; 
private static final int MIN = 11111111; 

public int generateCode(){ 

    Random random = new Random(); 
    int code = random.nextInt(MAX-MIN+1)+MIN; 
    return code; 

} 

私はすでにTrackingStatus_IDが20.Iから始まるtrackingstatusテーブルに大量のデータを持っているが、私はデータを挿入していながら、それにデータを挿入する必要はありませんパーセルトラッキングの1行は、トラッキング状態テーブルの行数に対応します。

私は以下のようにコードを実行しようとしていますが:

TestClassを:

Set<TrackingStatus> statuses = new HashSet<TrackingStatus>(); 

    RandomCode randomCode = new RandomCode(); 

    SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); 

    Session session = sessionFactory.getCurrentSession(); 

    session.beginTransaction(); 

    int trackingCode = randomCode.generateCode(); 

    ParcelTracking parcelTracking = new ParcelTracking(); 
    parcelTracking.setTracking_ID(trackingCode); 
    parcelTracking.setComments("NO COMMENT PLEASE"); 
    parcelTracking.setUpdate_DateTime(new Date()); 

    TrackingStatus trackingStatus = session.get(TrackingStatus.class,22); 
    session.setReadOnly(trackingStatus, true); 
    statuses.add(trackingStatus); 
    parcelTracking.setTrackingStatus(statuses); 

    session.saveOrUpdate(parcelTracking); 
    session.getTransaction().commit(); 
    session.close(); 

私は、次のエラーを得た:

org.hibernate.exception.GenericJDBCException: could not execute statement 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207) 
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2921) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421) 
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434) 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295) 
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468) 
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135) 
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352) 
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231) 
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65) 
at org.tracktest.TestClass.main(TestClass.java:44) 
Caused by: java.sql.SQLException: Field 'TrackingStatus_ID' doesn't have a default value 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) 
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) 
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) 
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) 
... 18 more 

私はせずにparceltrackingテーブルにデータを挿入することができる方法trackingstatusテーブルに挿入しますか? 2つのテーブル間の関係は、1対多でなければなりません。

+0

あなたはあなたの質問を編集して、あなたの質問に答えてください。 – Thierry

+0

あなたが調べました:http://stackoverflow.com/questions/21244110/hibernate-sqlexception-field-doesnt-have-default-value? – Thierry

関連する問題