Ich versuche, viele zu einer Beziehung durch SpringMVC und JPA zu bestehen.Kann nicht viele zu einer Relation in Spring mit JPA beibehalten (stattdessen neue übergeordnete Entität hinzufügen)
Meine Ansicht ist die folgende:
hinzufügen 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 ist die folgende:
@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 für Wörterbuch ist folgende:
und wordpair Einheit:
@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;
Auch gibt es ein Service und 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;
}
Das Problem ist, wenn ich versuche, WordPair
und Link Dictionary
anhalten Entity zu ihm, hält Hibernate neue Dictionary-Entität und dann persistent neue WordPair-Entität mit dem Hinzufügen eines neuen Wörterbuchs. So hängen Sie eine vorhandene Wörterbuch-Entity an, die ich mit dem Formular ausgewählt habe: Objekt in der Ansicht auswählen? Wenn ich
@ManyToOne(fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.All)
Option in WordPair zu oder etwas Merge zu ändern, gibt es
java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Objekt eine nicht gespeicherte transiente Instanz verweist - speichern Sie die vorübergehende Instanz vor spülen:
haben Sie versucht, die WordPairs-Liste im Dictionary-Objekt vor persist Dictionary zu setzen? – duardito
eigentlich, wenn ich versuche, Wörterbuch zu persistieren, ist alles in Ordnung. Ich möchte Wortpaar mit vorhandenem Wörterbuch persistieren, und es bleibt bestehen, aber mit neuem Wörterbuch leere Wörterbucheinheit (nur mit ID) – ILya
Sie können eine Entität nicht persistieren, die bereits persistent ist; muss 'merge' verwenden. – JimmyB