4

私は持っています:

@Entity
public class EmailAndName {
...
}

@Entity
public class MessageDetails {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "MessageDetails_to")
    public Set<EmailAndName> getTo() {
        return to;
    }
}

私が

public static void main(String []a)
{
    StatelessSession sess = HibernateUtils.getSessionFactory().openStatelessSession();
    sess.beginTransaction();
    MessageDetails messageDetails = new MessageDetails();
    messageDetails.setTo(new HashSet<EmailAndName>());
    EmailAndName emailAndName = (EmailAndName) sess.get(EmailAndName.class, 1L);
    if (emailAndName == null ) throw new RuntimeException();
    messageDetails.getTo().add(emailAndName);
    sess.insert(messageDetails);
    sess.getTransaction().commit();
}

MessageDetails_toテーブルにデータが入力されていません。私は何をすべきか?ネイティブクエリを書きたくありません。ありがとうございました。

4

3 に答える 3

5

ステートレスセッションのhibernate-docを読んだことがありません

それは明確に述べています:

Operations performed using a stateless session never cascade to associated instances. Collections are ignored by a stateless session.

そして、あなたはを追加しようとしていSet<EmailAndName>ます。ステートレスセッションは下位レベルの抽象化であり、基盤となるJDBCにはるかに近いものです。したがって、本当にコードを機能させてMessageDetails_toにデータを入力したい場合は、Sessionに進む必要があります。POJOのequalsメソッドとhashCodeメソッドを定義する必要があります:)

したがって、変更されたコードは次のようになります。

public static void main(String []a)
{
   try{
    Session sess = HibernateUtils.getSessionFactory().openSession();
    sess.beginTransaction();
    MessageDetails messageDetails = new MessageDetails();
    messageDetails.setTo(new HashSet<EmailAndName>());
    EmailAndName emailAndName = (EmailAndName) sess.get(EmailAndName.class, 1L);
    if (emailAndName == null ) throw new RuntimeException();
    messageDetails.getTo().add(emailAndName);
    sess.save(messageDetails);
    sess.getTransaction().commit();
 }
catch(HibernateException e)
 {
   sess.getTransaction.rollback();
   e.printStackTrace();
 }
  finally{
       sess.close();
  }

例外(存在する場合)を識別して機能させることができるように、常にtrycatchを同封する必要があります:)

于 2012-12-19T08:41:19.300 に答える
0

まず、トランザクションがコミットされていることを確認しますか?

次に、を使用していSetます。クラスのequalshashCodeメソッドが明確に定義されていることを確認しましたか?EmailAndName

于 2012-12-14T19:22:03.713 に答える
0

コードが機能しない主な理由はステートレスセッションの使用によるものだと思いますが、いずれにせよ、1-NとNMの関係を実装するときは、関係の逆側を定義して更新することをお勧めします両側。

さらに、カプセル化が破られるため、外部クラスにセットを直接操作させないでください。コレクションのsetメソッドを公開しないでください。非常に厄介な例外が発生し、デバッグが困難になる可能性があります。addメソッドとremoveメソッドを使用して、セットを更新します。

@Entity
public class MessageDetails {

    private Set<EmailAndName> to = new HashSet<EmailAndName>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "MessageDetails_to", 
       joinColumns = {@JoinColumn(name = "MESSAGE_DETAILS_ID"},
       inverseJoinColumns = {@JoinColumn(name = "EMAIL_AND_ADDRESS_ID")})
    public Set<EmailAndName> getTo() {
        return Collections.unmodifiableSet(to);
    }

    public void addEmaiAndName(EmailAndName emailAndName) {
       emailAndName.setMessageDetails(this);
       to.add(emailAndName);
    }

    public void removeEmailAndName(EmailAndName emailAndName) {
       emailAndName.setMessageDetails(null);
       to.remove(emailAndName);
    }

}

コードの他の部分は次のようになります。

Session sess = HibernateUtils.getSessionFactory().openSession();
sess.beginTransaction();
MessageDetails messageDetails = new MessageDetails();
EmailAndName emailAndName = (EmailAndName) sess.get(EmailAndName.class, 1L);
if (emailAndName == null ) throw new RuntimeException();
messageDetails.addEmailAndName(emailAndName);
sess.save(messageDetails);
sess.getTransaction().commit();
于 2012-12-22T00:05:20.930 に答える