0

質問があります。新しいプロパティをデータベースに保存しようとすると、このエラーが発生します。列 'property_id' を null にすることはできません。フィーチャ リストをデータベースに保存しようとすると、例外が発生します。何らかの理由で、挿入されたプロパティとフィーチャの間に関連性がありません。Property_id がオブジェクト PropertyFeature 内に存在しません。

ここに私のデータがあります:

table 'property':

id
name

table 'features'

id
title
property_id [not null]

エンティティ プロパティ

 @Table(name = "property")
public class Property extends...{

    @Column(name = "name", nullable = true)
    private String name;    

    @OneToMany(mappedBy = "property", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<PropertyFeature> features;  


    public Property() {
    }


    public Property(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   

    public Set<PropertyFeature> getFeatures() {
        return features;
    }

    public void setFeatures(Set<PropertyFeature> features) {
        this.features = features;
    }   

}

エンティティ プロパティ機能

@Entity
@Table(name = "property_feature")
public class PropertyFeature extends ... {


    @Column(name = "title", nullable = false)
    private String title;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Property property;

    public PropertyFeature() {

    }

    public PropertyFeature(String title) {
        this.title = title;
    }   

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }   

    public Property getProperty() {
        return property;
    }

    public void setProperty(Property property) {
        this.property = property;
    }
}

スプリングコントローラー

@Controller
@RequestMapping(value="/account")
public class AccountController {

    @Autowired
    PropertyServiceImpl propertyServiceImpl;

    @RequestMapping(method = RequestMethod.GET, value = "/test")
    public String accountPage(HttpServletRequest request, HttpServletResponse response, ModelMap model) {       


        Property property = propertyServiceImpl.load(12L);

        ArrayList<PropertyFeature> test = new ArrayList<PropertyFeature>();
        test.add(new PropertyFeature("Feature 1"));
        test.add(new PropertyFeature("Feature 2"));
        test.add(new PropertyFeature("Feature 3"));

        model.put("property", property);
        model.put("testList", test);

        return "/test";
    }   

    @RequestMapping(method = RequestMethod.POST, value = "/test")
    public String accountPost(HttpServletRequest request, HttpServletResponse response, Property property) {        

        propertyServiceImpl.update(property);       

        return "/test";
    }   

} 

JSP フォーム:

<form:form method="post" commandName="property">

Name <form:input path="name" type="text" name="name" value="" />
Features
<form:select multiple="true" path="features">
    <form:options items="${testList}" itemValue="title" itemLabel="title"/>
</form:select>

<input type="submit" name="submit" value="Test" />
4

2 に答える 2

1

Hibernate は、ManyToOneマップされたプロパティに再び結合するために、property_feature に外部キーが必要です。を使用して列を提供していない@JoinColumnため、Hibernate はデフォルト メカニズムを使用してスキーマに列を作成しました。これについては、セクション 2.2.5.3.1.4 で説明しています。

Property をオプションではないものとしてマップしたため、Hibernate は、保存Propertyする前に常に a を設定することを想定しています。PropertyFeatureプロパティ のリストにを追加しましたが、をオンにPropertyFeature設定していません。PropertyPropertyFeature

次のように、プロパティ クラスにメソッドを追加することをお勧めします。

public void addFeature(PropertyFeature feature) {
  feature.setProperty(this);
  features.add(feature);
}

次に、コントローラーで次のように記述できます。

Property property = propertyServiceImpl.load(12L);
property.addFeature(new PropertyFeature("Feature 1"));
于 2012-09-28T20:41:43.120 に答える
0

問題はわかりました。思いどおりにするには、プロパティと機能を接続する 3 つ目のテーブルが必要です。この場合、私は指定することができます

@JoinTable(name="property_features", joinColumns={@JoinColumn(name="property_id")}, inverseJoinColumns={@JoinColumn(name="id")})

この場合、hibernate は 3 番目のテーブルを作成し、オブジェクトの Property をすべての PropertyFeature インスタンスに設定する必要はありません。これはいいことですが、この場合の 3 番目のテーブルは好きではありません。

Property エンティティ メソッド setFeatures をそのようなものに更新すると思います

public void setFeatures(Set<PropertyFeature> features) {
        for(PropertyFeature pf : features)
            pf.setProperty(this);
        this.features = features;
    }

テスト済み、期待どおりに動作します。2 つのテーブルのみで処理するより良い方法があれば教えてください。ありがとう

于 2012-09-28T22:06:19.187 に答える