2

XMLマッピングからアノテーションに切り替えたところ、シリアル化クラスが機能しなくなったことに気づかなければなりませんでした。私はあなたが私が理由を見つけるのを手伝ってくれることを願っています:)

私はSchoolを含むクラスを持っていますAddress

@Entity
@Table(name="schools")
    public class School {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @ManyToOne
    @JoinColumn(name="address_id", nullable=true)
    private Address address;
        ...
}

クラスAddress

@Entity
@Table(name="addresses")
public class Address {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name="street", nullable=false, updatable=true)
    private String street;      // with nr
    ...
}

私はこのようにシリアル化しようとします:

sessionFactory = MyFactory.getSessionFactory();
            session = sessionFactory.openSession();

            Transaction tx = session.beginTransaction();

            School mbs = new School("interesting school");
            Address a = new Address("garden street 5","12345", "somewhere");
            mbs.setAddress(a);

            session.save(mbs);
            tx.commit();

これは以前はXMLで機能していましたが、現在は機能しません。

コンソールに表示される最初のHibernateクエリアクションは次のとおりです。Hibernate:学校に挿入(address_id、layout_id、name)値(?、?、?)

したがって、エラーが発生します。エラー:列'address_id'をnullにすることはできません

どうすればこれを修正できますか?

それらは表です:

CREATE TABLE schools(
    id INTEGER NOT NULL AUTO_INCREMENT,
    name CHAR(50),

    address_id INTEGER NOT NULL,
    layout_id INTEGER NOT NULL,

    CONSTRAINT fk_address FOREIGN KEY (address_id) REFERENCES addresses(id),
    CONSTRAINT fk_layout FOREIGN KEY (layout_id) REFERENCES layout_headers(id),

    PRIMARY KEY (id)
);
CREATE TABLE addresses(
    id INTEGER NOT NULL AUTO_INCREMENT,
    street CHAR(55),
    zip CHAR(6),
    city CHAR(60),

    CONSTRAINT addr_pk PRIMARY KEY (id)
);

私のhibernte.cfg.xmlには、次のものがあります。

<hibernate-configuration>
    <session-factory>
     ...
        <mapping class="creator.models.school.Address" />
        <mapping class="creator.models.school.Report" />
        <mapping class="creator.models.school.School" />
        <mapping class="creator.models.school.SchoolClass" />
        ...
    </session-factory>
</hibernate-configuration>
4

1 に答える 1

1

授業前にアドレスを保存するには、クラスのフィールドに注釈cascadeのプロパティを指定する必要があります。例えば、@ManyToOneaddressSchoolCascadeType.ALL

于 2012-12-04T13:17:54.373 に答える