私は双方向関係(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の}"
が、これはそれではありません。
番目に入力された名前を変更しようとしています。どのようにこれらのフィールドに値を設定するのですか?
あなたはRoomRepository saveHouse方法であなたの家のオブジェクトで部屋を取得していますか? – javafan
あなたはアプリケーションをデバッグしましたか、あなたがレポジトリに保存している家の部屋はありますか? :) –