2016-08-19 8 views
0

私は双方向関係(ManyToOne、OneToMany)で2つのエンティティを持っています 2テーブルハウス&ルーム。家には多くの部屋があります。
私はその住所と2つ(多分後で)の部屋で家を救う必要があります。 以下のコードは、部屋のない住宅と住所を追加します(room = null)。Spring JPA Hibernateオブジェクトはnullを保存するときnullです。

どうすればこの問題を解決できますか?

客室に関する私の入力は問題ありませんか? PHPで例えば私は name="roomName[]"

があるでしょう、私は、Hibernateが私のために全力を尽くしますと思った:)私はcascadeType.ALL

@Entity 
@Data 
public class House { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    private Long id; 

    private String name; 

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "address_id") 
    private PostalAddress address; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "house", fetch = FetchType.EAGER) 
    private Set<Room> rooms; 
} 

ルーム

@Entity 
@Data 
public class Room { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    private int id; 

    private String name; 

    @NotNull 
    private int capacity; 

    @NotNull 
    @ManyToOne 
    @JoinColumn(name = "house_id") 
    private House house; 
} 

を作成し使用する場合は特にデータベースエントリフォーム

<input type="text" name="name" placeholder="house name..." /> 
<input type="text" name="address.addressLocality" placeholder="locality" /> 
<input type="text" name="address.postalCode" placeholder="postalCode" /> 
<input type="text" name="address.streetAddress" placeholder="street" /> 
<input type="text" name="room.name" placeholder="room name" /> 
<input type="text" name="room.capacity" placeholder="capacity" /> 
<input type="text" name="room.name" placeholder="room name" /> 
<input type="text" name="room.capacity" placeholder="capacity" /> 

最後に私のコントローラとリポジトリ

public interface RoomRepository extends CrudRepository<Room, Long> { 
} 

@RequestMapping(value = "/create", method = RequestMethod.POST) 
public String saveHouse(@ModelAttribute("house/new") House house, BindingResult bindingResult, Model model) { 

    houseRepository.save(house); 

    return "redirect:/house/list"; 

} 

//重要EDIT

私が間違っている可能性がどのような先端を持っているが、私はこの問題を解決することはできません。私はThymeleafを使用しています。ハウスに多数のルームがある場合(ルームの設定)、ルーム入力を含むフォームの一部が正しくありません。ユーザーは、多かれ少なかれ部屋を追加したいとき、私は私がいた(jQueryのを使用して)彼は削除/入力 でテーブルの行を追加し テーブル内の4行(ルーム名、容量)

、デフォルトでは、
<tr th:each="i,iterStat : ${#numbers.sequence(1, 4)}"> 
    <td class="col-xs-9 col-md-9"><input type="text" name="rooms.name" th:value="ROOM + ' ' + ${iterStat.current}" class="form-control"/> </td> 
    <td class="col-xs-2 col-md-2"><input type="number" name="rooms.capacity" min="1" step="1" value="4" class="form-control"/> </td> 
    <td class="col-xs-1 col-md-1"><button type="button" class="btn red pull-right" onclick="removeTableRow(this)"> <i class="fa fa-trash"></i> </button></td> 
</tr> 

を表示していますフィールド= "* {部屋[$ {} iterStat.current] .nameの}"

が、これはそれではありません。

番目に入力された名前を変更しようとしています。どのようにこれらのフィールドに値を設定するのですか?

+0

あなたはRoomRepository saveHouse方法であなたの家のオブジェクトで部屋を取得していますか? – javafan

+0

あなたはアプリケーションをデバッグしましたか、あなたがレポジトリに保存している家の部屋はありますか? :) –

答えて

0

はと家のエンティティマッピングを試してみてください。

@OneToOne(fetch = FetchType.EAGER, mappedBy = "house", cascade = {CascadeType.ALL}) 
private PostalAddress address; 

@OneToMany(fetch = FetchType.EAGER, mappedBy = "house", cascade = {CascadeType.ALL}, orphanRemoval = true) 
private Set<Room> rooms; 

のPostalAddress:

@OneToOne 
@JoinColumn(name="house") 
private House house; 

ルーム:

@NotNull 
@ManyToOne 
@JoinColumn(name="house") 
private House house; 
+0

あなたの提案を適用した後、アプリケーションは入れ子にされた例外を与えるものを保存していません。私は、あなたがHibernate.AnnotationExceptionを避けるために他の(部屋、家)変更のためにPostalAddressエンティティを変更しようとしていると思います:PostalAddressの未知のmappedBy。基本的には、すでに働いているもの、つまり家の住所を変更しない方がいいでしょう。 – Krystiansen

+0

あなたの問題を誤解しているかもしれません。あなたのバージョンコードを保存するとき - ハウスは部屋を含んでいますか? – Justas

+0

私はhouseRepository.save(house)にbraekpointをマークしました。Roomはnullです – Krystiansen

関連する問題