SpringMVCとJPAを通じて多対1の関係を維持しようとしています。JPAでSpringで多対1リレーションを永続化できません(新しい親エンティティを新しく追加)
私の見解は以下の通りです:
WordPair
<form:form modelAttribute="wordpair" action="addWordPair" method="post">
<label for="semanticUnitOne">Enter word one: </label>
<form:input path="semanticUnitOne"/>
<br/>
<label for="semanticUnitTwo">Enter word two: </label>
<form:input path="semanticUnitTwo"/>
<br/>
<div class="form-group">
<label for="dictionary">Dictionary</label>
<form:select path="dictionary" cssClass="selectpicker" items="${dictionaries}" itemLabel="name" itemValue="id">
<%--<form:options items="${dictionaries}" itemValue="id" itemLabel="name"/>--%>
</form:select>
</div>
<input type="submit" class="btn" value="Add word pair"/>
</form:form>
<div class="control-group">
</div>
</div>
コントローラは以下の通りです追加:辞書用
@Controller
public class WordPairController {
@Autowired
WordPairService wordPairService;
@Autowired
DictionaryService dictionaryService;
@RequestMapping(value = "createWordPair", method = RequestMethod.GET)
public String createWordPair(Model model) {
model.addAttribute("wordpair", new WordPair());
model.addAttribute("dictionaries", this.dictionaryService.findAll());
return "addWordPair";
}
@RequestMapping(value = "addWordPair", method = RequestMethod.POST)
public String addWordPair(@ModelAttribute("wordpair") WordPair wordPair, BindingResult result, Dictionary dictionary) {
wordPair.setDictionary(dictionary);
wordPairService.save(wordPair);
return "addWordPair";
}
@RequestMapping(value = "wordPairGet", method = RequestMethod.GET)
public String wordPairGet(Model model) {
model.addAttribute("wordPair", wordPairService.findAllWordPairs());
return "wordPairGet";
}
}
Entitiyは以下の通りです:
@Entity
public class Dictionary {
@Id
@GeneratedValue
private Long id;
private String name;
private String comment;
@OneToMany(mappedBy = "dictionary", cascade = CascadeType.All, fetch=FetchType.EAGER)
private List<WordPair> wordPairs;
とwordpairエンティティ:
@Entity
@Table
public class WordPair {
@Id
@GeneratedValue
private Long id;
private String semanticUnitOne;
private String semanticUnitTwo;
private int rating;
@ManyToOne(fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.All)
private Dictionary dictionary;
はまた、サービスやDAO、
@Repository("dictionaryDao")
public class DictionaryDaoImpl implements DictionaryDao {
@PersistenceContext
private EntityManager em;
public Dictionary save(Dictionary dictionary) {
em.persist(dictionary);
em.flush();
return dictionary;
}
public List<Dictionary> findAllDictionaries() {
List<Dictionary> result = em.createQuery("SELECT d FROM Dictionary d", Dictionary.class).getResultList();
return result;
}
}
@Repository("wordPairRepository")
public class WordPairDaoImpl implements WordPairDao {
@PersistenceContext
private EntityManager em;
public List<WordPair> findAllWordPairs() {
List<WordPair> result = em.createQuery("SELECT p FROM WordPair p", WordPair.class).getResultList();
return result;
}
public WordPair save(WordPair wordPair) {
em.persist(wordPair);
em.flush();
return wordPair;
}
がある私はWordPair
とリンクDictionary
を持続しようとすると問題がありますそれに対してエンティティは、hibernateは新しい辞書エンティティを維持し、その後新しいwordPairエンティティそれに新しい辞書を添付して。どのように私はフォームで選択した既存の辞書エンティティを添付する:ビュー内の選択項目ですか? org.hibernate.TransientPropertyValueException::私はか何かをマージにWordPairで
@ManyToOne(fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.All)
オプションを変更した場合 、それは
java.lang.IllegalStateException与えオブジェクト参照 保存されていない一時的なインスタンスを - フラッシングの前に一時インスタンスを保存します。
あなたは辞書の前に辞書オブジェクトのwordPairsリストを設定しようとしましたか? – duardito
実際に辞書を永続化しようとすると、すべて正常です。私は既存の辞書と単語のペアを永続させたいが、それは持続するが、新しい辞書の空の辞書のエンティティ(idのみ) – ILya
すでに永続化しているエンティティを「持続」することはできない。 'merge'を使う必要があります。 – JimmyB