0

私は3つのエンティティを持っています。つまり、ABC エンティティ A と B には 1 対 1 の関係があります。B と C には多対多の関係があります。

@Entity
@Access(AccessType.FIELD)
class A{
    @OneToOne(cascade=CascadeType.ALL)
    private B b;

}


@Entity
@Access(AccessType.FIELD)
class B{
    @ManyToMany(cascade = CascadeType.ALL, mappedBy="b")
    @JoinTable(name ="C_B", joinColumns=@JoinColumn(name="B_id"), inverseJoinColumns=@JoinColumn(name="C_id"))
    Set<C> C = new HashSet<C>();

    @OneToOne(cascade=CascadeType.ALL)
    private A a;
}

@Entity
@Access(AccessType.FIELD)
class C{
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name ="C_B", joinColumns=@JoinColumn(name="C_id"), inverseJoinColumns=@JoinColumn(name="B_id"))
    Set<B> b = new HashSet<B>();

}

A のエンティティを作成し、エンティティ B を作成して設定a.setB(b)b.setA(a)、永続化します。テーブルに保存されます。しかし、それは所有者ではないので、B から B と C の間の関係をどのように設定するのでしょうか?

フォローしてみた

a.setB(b);
b.setA(a);
b.setC(c);

結合テーブル C_B にエントリを作成していません。

そして作成

a.setB(b);
b.setA(a);
b.setC(c);
c.setB(b);

null ポインター例外をスローします。スタックトレース

2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:) Caused by: java.lang.NullPointerException
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.type.IntegerType.next(IntegerType.java:59) 
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.engine.Versioning.increment(Versioning.java:108)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.event.def.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:365)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:257)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:128)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
2013-10-30 22:22:39,652 ERROR [STDERR] (http-0.0.0.0-8080-3:)   ... 77 more

B と C の関係を確立する方法

セッターはこんな感じ

setB(B b){
        this.B.add(b);
    }

    setC(C c){
        this.C.add(c);
    }
4

0 に答える 0