当前位置: 首页 > 知识库问答 >
问题:

在Spring中,不能用JPA将多个关系持久化(改为添加新的父实体)

夹谷星剑
2023-03-14
  <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";
}

}

字典的实体如下:

@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;
@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;
}
@ManyToOne(fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.All) 

java.lang.IllegalStateException:org.hibernate.transientPropertyValueException:object引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:

共有1个答案

穆乐逸
2023-03-14

我将Spring JPA与Hibernate5一起使用,我让Hibernate创建表。

我有实体:

@Entity(name = "DICTIONARY")
public class Dictionary {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
    private String comment;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name="DICTIONARY_ID")
    private List<WordPair> wordPairs;

@Entity(name = "WORDPAIR")
public class WordPair {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String semanticUnitOne;
    private String semanticUnitTwo;
    private int rating;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Dictionary dictionary;
@Repository
@Transactional
public interface DictionaryRepository extends CrudRepository<Dictionary, Long> {
}
@Repository
@Transactional
public interface WordPairRepository extends CrudRepository<WordPair, Long> {
}
DICTIONARY
    ID
    COMMENT
    NAME
WORDPAIR
    ID
    RATING
    SEMANTICUNITONE
    SEMANTICUNITTWO
    DICTIONARY_ID
    Dictionary dictionary = makeDictionary("comment", "dictionary 1");
    dictionary.setWordPairs(new ArrayList<WordPair>());
    dictionary.getWordPairs().add(makeWordPair("George", "Unit 3", "Unit 4", 65));
    dictionary.getWordPairs().add(makeWordPair("Greg", "Unit 2", "Unit 1", 25));

    dictionaryRepository.save(dictionary);

    dictionary = dictionaryRepository.findOne(1l);
    assertEquals("dictionary 1", dictionary.getName());

    WordPair wordPair = wordPairRepository.findOne(dictionary.getWordPairs().get(0).getId());
    assertEquals("dictionary 1", wordPair.getDictionary().getName());

    wordPair.getDictionary().setName("dictionary 2");
    wordPairRepository.save(wordPair);

    wordPair = wordPairRepository.findOne(dictionary.getWordPairs().get(0).getId());
    assertEquals("dictionary 2", wordPair.getDictionary().getName());

    dictionary = dictionaryRepository.findOne(1l);
    assertEquals("dictionary 2", dictionary.getName());
 类似资料:
  • 我是Spring/JPA/Hibernate的新手,虽然听起来很简单,但现实并非如此。我需要一些帮助。 第1轮,我创建一个新的父级和一个新的子级,将子级添加到父级列表中,并在子级上设置父级。我救了父母,孩子也就救了。 现在,第二轮,我添加一个新的孩子: 然而,这一次的新孩子却从来没有坚持过! 通过hibernate(痛苦!)来跟踪这个,我发现了以下内容: 第二次保存时,问题是第二个(新)子级。 问

  • 情况: 我有两个与OneTomany/ManyToone关系相关的实体。 想象一下,每个类也有一个名为id和getter和setter的PK。 问题: 如果我创建一个EntityA实例并设置一个与已经存在的EntityB实例的关系并持久化这个新实例,那么所有数据都会正确地保存到数据库中。但是,如果我从我的EntityManager请求EntityB的实例,它的列表中将不包含刚刚持久化的Entity

  • 对于新学生和新课程的情况,它工作得很好,但是在新课程和现有学生的情况下,我会从数据库中抛出一个唯一的约束冲突。关系类似于下面。 在持久化之前,我尝试使用entitymanager查找一个学生,如果该学生存在,则使用该实例而不是新的学生实例。这也不起作用,它仍然尝试执行插入而不是更新

  • 我正在努力做, 其中,父母一在模式S1中,父母二在模式S2中与儿童表在一起。 家长一号。JAVA 家长wo.java ChildTable.java 这里ParentTwo已经被持久化了,我有它的Id。我将只保留ParentOne以及不同模式的子表。当我这么做的时候,我会犯这样的错误。 rg.springframework.dao.:无法执行语句;SQL[n/a];约束[null];嵌套异常org

  • 我有一个父实体a,它与映射在a_B表和a_C表中的实体B和实体C有多对多关系。在持久化时,我希望只持久化a、a_B和a_C,而不持久化B和C。如果我不使用cascadetype。all i get“object references a unsaved transient instance-save the transient instances before flush”错误。如果我使用casc

  • 我正在尝试持久化一个与其他已经持久化的对象具有多对多关系的对象。 下面是我的持久化对象(它们已经在db中持久化了,这是一个MySql):- 产品 这是我的no persisted对象,我正在尝试创建它 这是我的类,它接收产品名称的数组,使用该名称查看产品并将其放入reservation对象。 下面是我的接口: 严重:路径为[/web]的上下文中servlet[dispatcher]的servlet